그래서 해결하려는 문제는 다음과 같습니다. 우리는 Entity Framework를 사용하여 1200-1500 개의 테이블이있는 Oracle 데이터베이스에 액세스합니다. 이제 우리는 그들 모두에 접근하지는 못했지만 아마도 800 명 이상의 사람들이 접근 할 수 있습니다. 우리는 UnitOfWork -> Repository -> Service 패턴을 사용하고 있으며 훌륭하게 작동합니다. 그러나 우리는 하나의 큰 DbContext를 가져야하는지 아니면 당면한 작업에 특정한 여러 개의 작은 컨텍스트를 가져야 하는지를 파악하려고합니다.UnitOfWork 및 Entity Framework 컨텍스트
우리의 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;
}
}
어떤 제안?
+1 줄리 만 참조. 그녀는 EF의 보스입니다! –
... 나머지 조언은 매우 좋습니다. :) –