entity-framework - 工作单元、存储库和 IDisposable

标签 entity-framework repository-pattern unit-of-work

我一直在考虑在我正在从事的项目中实现这些模式。 UoW 拥有数据库上下文,然后使用该上下文实例化多个存储库。我的问题是处理上下文。我见过的很多文章都将存储库作为 IDisposable,然后他们处理了上下文。这让我一直困惑不已,我是否遗漏了什么,或者(在我的情况下)应该只是处理上下文的 UoW?另外,我应该在我的存储库上实现 IDisposable 吗?

谢谢

克里斯

最佳答案

是的,工作单元应该实现 IDisposable并处理上下文,而不是存储库。

下面是一个例子:

public interface IUnitOfWork : IDisposable
{
    void Commit();
}

public class EntityFrameworkUnitOfWork<TContext> : IUnitOfWork 
    where TContext : DbContext, new()
{
    public EntityFrameworkUnitOfWork()
    {
        this.DbContext = new TContext();
        ConfigureContext(this.DbContext);
    }

    protected virtual void ConfigureContext(TContext dbContext)
    {
        dbContext.Configuration.ProxyCreationEnabled = false;
        dbContext.Configuration.LazyLoadingEnabled = false;
        dbContext.Configuration.ValidateOnSaveEnabled = false;
    }

    protected TContext DbContext { get; private set; }

    public void Commit()
    {
        this.DbContext.SaveChanges();           
    }

    public void Dispose()
    {
        this.Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!disposing)
        {
            return;
        }

        if (this.DbContext == null)
        {
            return;
        }

        this.DbContext.Dispose();
        this.DbContext = null;
    }
}

关于entity-framework - 工作单元、存储库和 IDisposable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15972978/

相关文章:

c# - LINQ、存储库模式和数据库抽象

asp.net-mvc - 在 Asp.Net MVC 应用程序中调用 UnitOfWork.Commit() 的位置

c# - 修改 Entity Framework 的表达式树,尽可能接近 T-SQL translation\execution

c# - 分析 WPF + WCF + EF 应用程序

c# - 具有多个参数的 Func<T, string>

asp.net-mvc - 在 MVC Web 应用程序中跨存储库共享 DbContext

asp.net-mvc - 存储库模式和 IQueryable<T> 的性能

c# - 生产环境中transactionScope和ServiceBus的问题

c# - 为什么 Entity Framework 不使用工作单元实现恒等映射?

php - 我在我的项目中使用 PHP 的工作单元设计模式