Entity framework 在实体框架中的存储库类中使用DbContext

Entity framework 在实体框架中的存储库类中使用DbContext,entity-framework,dbcontext,unit-of-work,Entity Framework,Dbcontext,Unit Of Work,我尝试编写一个MVC n层应用程序。我在连接数据库时使用了存储库模式。在我的repository类中,我在repository类中有一个上下文变量。我不确定这种做法是否正确。这是我的密码: public class TTPDbContext : DbContext { public TTPDbContext() : base("TTPContext") { Database.SetInitializer(new DropCreateDatabaseIfMode

我尝试编写一个MVC n层应用程序。我在连接数据库时使用了存储库模式。在我的repository类中,我在repository类中有一个上下文变量。我不确定这种做法是否正确。这是我的密码:

 public class TTPDbContext : DbContext
{

    public TTPDbContext() : base("TTPContext")
    {
        Database.SetInitializer(new DropCreateDatabaseIfModelChanges<TTPDbContext>());
        Database.Log = s => Debug.WriteLine(s);
        Configuration.AutoDetectChangesEnabled = true;

    }

    public DbSet<Kisi> Kisiler { get; set; }
    public DbSet<BakanlikBirim> BakanlikBirimleri { get; set; }
    public DbSet<DisBirim> DisBirimler { get; set; }
    public DbSet<Kullanici> Kullanicilar { get; set; }

    public DbSet<Talep> Talepler { get; set; }
    public DbSet<UnvanPozisyon> UnvanPozisyonlar { get; set; }

    public DbSet<TalepDurum> TalepDurumlar { get; set; }

    public DbSet<TalepKagidi> TalepKagidi { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema("OsiTtp");
    }

}
以下是存储库类:

public class TTPRepository : ITTPRepository,IDisposable
{

private IErrorHandling _errorHandling;

private TTPDbContext _context;

public TTPRepository()
{

    this._errorHandling = new ErrorHandling();
    this._context = new TTPDbContext();
}

// other sections has been dismissed for brevity.

public List<DisBirim> GetAllExternalInstitutions()
{
    List<DisBirim> result = null;
    DbSet<DisBirim> intermediaryresult = null;

    try
    {
        result = new List<DisBirim>();

        intermediaryresult = this._context.DisBirimler;

        if (intermediaryresult != null)
        {
            foreach (DisBirim institution in intermediaryresult)
            {
                result.Add(institution);
            }
        }


    }
    catch (Exception Hata)
    {
        this.yazHata(Hata);
    }

    return result;
}

public void Dispose()
{
    this._context.Dispose();
}
}


我不确定这是一个最佳的方法。你有什么建议吗?提前谢谢

当使用存储库模式和接口时,最佳实践是使用IoC容器将DbContext注入存储库构造函数

如果您使用的是IoC容器,那么可以控制DbContext的生存期,以确保存储库的所有实例都获得相同的上下文

你必须是像Unity,Ninject,Autofac


unity用法文档

我建议阅读

而不是这个

试试这个

public TTPRepository(TTPDbContext context,ErrorHandling errorHandler)
{
  this._errorHandling = errorHandler;
  this._context = context;
}
这样,您的存储库就可以使用上下文和错误处理程序了。我总是建议使用IerroHandler和IDbContext之类的东西,而不是具体的类

所以你可以这样自由初始化。即使使用IoC容器,也可以控制上下文的生存期

var yourRepo = new TTPRepository(new TTPDbContext());

定义什么是最优?正如我写的,听起来你是在民意调查,这是离题的。不,我的意图不是基于意见,我想从工程的角度受到批评。我已经阅读了一些关于我的设计的文件,但是我不能理解其中的很多。这将是一个ASP.NETMVC项目,因此有许多线程可以运行此代码。此外,我认为打开到数据库的连接和TTPDbContext对象的处理可以是基于业务事务的,我的意思是,每当业务事务开始时,TTPDbContext应该被打开和打开,每当业务事务结束时,TTPDbContext应该被处理。我是说,这是一种最优性。
var yourRepo = new TTPRepository(new TTPDbContext());