gpt4 book ai didi

entity-framework-4 - Entity Framework 4 中的存储库模式我们应该何时处置?

转载 作者:行者123 更新时间:2023-12-03 08:55:39 25 4
gpt4 key购买 nike

EF 新手,我注意到使用存储库模式可以真正简化事情,并且允许我做一些模拟。到目前为止一切都很好。

我的问题

objectContext 的一个典型用法是尽快销毁,见下文

using (var context = new SchoolEntities())
{
context.AddToDepartments(department);
context.SaveChanges();
}

使用存储库模式我注意到没有人真正使用“使用模式”,例如

using (var repository= new Repository<Student>(new MyContext))
{
repository.Add(myStudentEntity)
repository.SaveChanges();
}

这个想法是否应该是我们应该尽快处理上下文,否则内存可能会泄漏或变得非常大?

谁能澄清一下?非常感谢。

最佳答案

是的,即使您正在使用存储库,您也应该处理上下文。目前尚不清楚您的 Repository 实现会给您带来什么优势,因为您仍然提供 ObjectContext 作为构造函数的参数,不是吗?

IMO 使用 Repository 和自定义 UnitOfWork 的主要原因是持久性无知 = 从上层应用程序层隐藏 EF 代码,因为 ObjectContext + ObjectSet 本身是存储库和工作单元模式的实现。

如果我使用存储库,我总是包装整个 EF 代码,因此我的存储库的公共(public)接口(interface)不提供有关 EF 相关基础设施的任何信息。在这种情况下,如何处理 ObjectContext 取决于我。

对于简单直接的 CRUD 场景,我可以将上下文创建和处理包装到每个存储库方法中。在更复杂的场景中,我使用了额外的类 - UnitOfWork (UoW),它包装了上下文创建和处理,并触发将更改保存到数据库中。它还充当所有存储库的工厂,并将创建的上下文的实例传递给存储库的构造函数。

大多数时候我都在编写服务或 Web 应用程序,所以我正在处理分离的对象。我总是使用单个 UoW 实例进行请求处理。因此 UoW 在请求处理开始时创建,在请求处理结束时释放。在 WinForms/WPF 应用程序和附加对象的情况下,我认为好主意是让 UoW/ObjectContext 实例“按表单” - 有 article在 MSDN 杂志中使用 NHibernate session (与 EF ObjectContext 相同)描述了这种方法。

UnitOfWork 和 Repository 模式的一些开始实现:

存储库的上下文持有者和抽象工厂

public interface IUnitOfWork
{
IRepository<MyEntity> MyEntityRepository { get; }
// Repositories for other entities

SaveChanges();
}

分离实体的存储库

public interface IRepository<T> where T : class
{
IQueryable<T> GetQuery();
void Insert(T entity);
void Delete(T entity);

// In very complex scenarios with big object graphs you will probably give up
// using detached approach and you will always load your entities from DB before
// deleting or updating them. In such case you will not need Update method at all.

void Update(T entity);
}

UnitOfWork 包装 Entity Framework 的一次性实现

public class UnitOfWork : IUnitOfWork, IDisposable
{
private ObjectContext _context = null;

public UnitOfWork(string connectionString)
{
if (String.IsNullOrEmpty(connectionString)) throw new ArgumentNullException("connectionString");
_context = new ObjectContext(connectionString);
}

private IRepository<MyEntity> _myEntityRepository;

public IRepository<MyEntity> MyEntityRepository
{
get
{
return _myEntityRepository ?? (_myEntityRepository = new GeneralRepository<MyEntity>(_context));
}
}

public void SaveChanges()
{
_context.SaveChanges();
}

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

protected virtual void Dispose(bool disposing)
{
if (disposing)
{
if (_context != null)
{
_context.Dispose();
_context = null;
}
}
}
}

基础存储库实现

public class GeneralRepository<T> : IRepository<T> where T : class
{
private ObjectSet<T> _set;
private ObjectContext _context;


public GeneralRepository(ObjectContext context)
{
if (context == null) throw new ArgumentNullException("context");
_context = context;
_set = context.CreateObjectSet<T>();
}

// Override this method for example if you need Includes
public virtual IQueryable<T> GetQuery()
{
return _set;
}

// Override following methods if you are working with object graphs.
// Methods do not execute operations in database. It is responsibility of
// UnitOfWork to trigger the execution

public virtual void Insert(T entity)
{
if (entity == null) throw new ArgumentNullException("entity");
_set.AddObject(entity);
}

// These impelementations are for detached scenarios like web application

public virtual void Delete(T entity)
{
if (entity == null) throw new ArgumentNullException("entity");
_set.Attach(entity);
_set.DeleteObject(entity);
}

public virtual void Update(T entity)
{
if (entity == null) throw new ArgumentNullException("entity");
_set.Attach(entity);
_context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
}
}

选择数据时的用法

using (var uow = new UnitOfWork(connectionString))
{
var entity = uow.MyEntitiesRepository.GetQuery().Single(e => e.Id == 1);
// Do something with entity
}

修改数据时的用法

using (var uow = new UnitOfWork(connectionString))
{
uow.MyEntitiesRepository.Update(entity);
uow.SaveChanges();
}

关于entity-framework-4 - Entity Framework 4 中的存储库模式我们应该何时处置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4295975/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com