在Entity Framework中的Repository类中使用DbContext

时间:2017-03-13 12:19:23

标签: entity-framework dbcontext unit-of-work

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

 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();
}

}

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

2 个答案:

答案 0 :(得分:1)

我建议您阅读msdn documentation

  

而不是这个

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

试试这个

public TTPRepository(TTPDbContext context,ErrorHandling errorHandler)
{
  this._errorHandling = errorHandler;
  this._context = context;
}

通过此,您的存储库已准备好使用contextError Handler。我总是建议使用像IErrorHandlerIDbContext这样的东西而不是具体的类。

所以你可以像这样自由地进行初始化。即使您使用IoC容器,您也可以控制Context的生命周期。

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

答案 1 :(得分:0)

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

如果您使用的是IoC容器,则可以控制DbContext的生命周期,以确保Repository的所有实例都获得相同的Context。

你必须拥有一个IoC容器,如Unity,Ninject,Autofac,......

统一使用的文件Dependency Injection in ASP.NET MVC - An Introduction