从其他Entity Framework Controller类调用Entity Framework代码类

时间:2015-11-05 07:52:06

标签: c# asp.net-mvc entity-framework-6

我的控制器中有很多重复的代码,我试图将其卸载到共享的助手类,以便我可以在一个地方更新,而不是在当前的数百个地方进行更新。

我已经将重复的代码提取到一个单独的方法,但是,我无法确定如何在没有再次调用实体框架的情况下从数据库中实际获取数据。

在给出一个非常粗略的例子之前:

class foo{
private MyDbContext db = new MyDbContext();
Public Actionresult test()
{
     ViewModel.bla = new dbhelper.getbla();
     ViewModel.page = db.uniquelogic.tolist();
}

后:

class dbhelper{
private MyDbContext db = new MyDbCotnext();
public bla getbla()
{
...logic here
return bla
}

共享文件(bla.cs):

android:scaleType="center"

所以,这两种方法在这里工作,我更喜欢使用第二种,因为我只需要更新一次,但是,我的问题是:

  1. 多次调用DbContext有什么问题吗?我记得EF 3(我最后一次使用它),它引起了错误,我很惊讶它现在有效。
  2. 在控制器中,有一个seprate dispose子句,标准类中没有任何东西可以调用。这是一个问题吗?
  3. 有更好的方法吗?它没有“感觉”正确,但是,我不确定还能做什么。

1 个答案:

答案 0 :(得分:1)

多个Controller类共有的逻辑可以移动到基类“BaseController”类,因此也可以自动控制对象的生命周期:

public abstract class BaseController : Controller {

    private MyDbContext _db;

    protected MyDbContext DBContext {
        get { return _db ?? ( _db = new MyDbContext() ); }
    }

    protected void PopulateViewModel(ViewModel vm) {
        vm.Bla = this.DBContext.GetBla();
        vm.Page = this.DBContext.UniqueLogic.ToList();
    }

    protected override void Dispose(bool disposing) {
        if (disposing && this._db != null) {
            this._db.Dispose();
            this._db = null;
        }
        base.Dispose(disposing);
    }
}

然后在你的派生控制器中:

public class SomeAreaController : BaseController {

    public ActionResult Test() {

        ViewModel vm = new ViewModel();
        this.PopulateViewModel( vm );

        // and if you still need access to a DbContext, use the inherited property:
        this.DBContext.DoSomething();

        return this.View( vm );
    }
}