1

所以我要解决的问题是这个;我们正在使用实体框架来访问我们的 Oracle 数据库,该数据库有 1200-1500 个表。现在请注意,我们不会全部访问它们,但可能有 800 多个可以访问。我们正在使用 UnitOfWork --> Repository --> Service 模式,效果很好,但我们正在尝试确定是否应该拥有一个大的 DbContext,或者多个特定于手头任务的小上下文。

我们的 UnitOfWork 是使用 EFUnitOfWorkBase 设置的,如下所示:

public abstract class EFUnitOfWorkBase : IUnitOfWork
{
    private bool isDisposed = false;

    public DbContextBase Context { get; set; }

    protected EFUnitOfWorkBase(DbContextBase context)
    {
        Context = context;
    }

    public int Commit()
    {
        return Context.SaveChanges();
    }

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

    private void Dispose(bool disposing)
    {
        isDisposed = true;
        if (disposing)
        {
            if (this.Context != null)
                this.Context.Dispose();
        }
    }

    public IRepository<TEntity> GetRepository<TEntity>() where TEntity : Common.EntityBase<TEntity>
    {
        return new Repository<TEntity>(this);
    }
}

我们创建的任何工作单元都扩展了该基础单元并提供如下上下文:

public class EmployeeDirectoryUnitOfWork : EFUnitOfWorkBase
{
    public EmployeeDirectoryUnitOfWork(string connectionString)
        : base(new EmployeeDirectoryContext(connectionString))
    {
    }
}

DbContext 通过工作单元传递一个连接字符串。

Repository看起来像这样:

public abstract class RepositoryBase<TEntity> : IRepository<TEntity> where TEntity : class
{
    protected DbContextBase Context;
    protected DbSet<TEntity> EntitySet;

    public RepositoryBase(EFUnitOfWorkBase unitOfWork)
    {
        Enforce.ArgumentNotNull(unitOfWork, "unitOfWork");

        Context = unitOfWork.Context;
        EntitySet = Context.Set<TEntity>();
    }

    public TEntity Add(TEntity entity)
    {
        Enforce.ArgumentNotNull(entity, "entity");

        return EntitySet.Add(entity);
    }

    public TEntity Attach(TEntity entity)
    {
        Enforce.ArgumentNotNull(entity, "entity");

        return EntitySet.Attach(entity);
    }

    public TEntity Delete(TEntity entity)
    {
        Enforce.ArgumentNotNull(entity, "entity");

        return EntitySet.Remove(entity);
    }

    public System.Linq.IQueryable<TEntity> Query()
    {
        return EntitySet.AsQueryable();
    }

    public TEntity Save(TEntity entity)
    {
        Enforce.ArgumentNotNull(entity, "entity");

        Attach(entity);
        Context.MarkModified(entity);

        return entity;
    }
}

关于如何最好地处理这种情况的任何建议?

4

1 回答 1

7

在这种情况下,当您有这样的大型应用程序时,我认为您可能应该采用更多的领域驱动设计方法并将上下文拆分为一些单独的有界上下文。这样,当后来的开发人员向程序添加功能时,他们将被限制为只能访问某些表,具体取决于他们将在那里使用的上下文。

为了获得更好的信息,Julie Lerman 最近推出了一门关于 Pluralsight 的关于企业实体框架的课程,非常棒。她在这个网站上发布了一个小片段(实际上是关于有界上下文)。这是一门非常好的课程,我强烈推荐它,尤其是对于你正在做的事情。

于 2013-02-08T20:31:14.730 回答