【发布时间】:2011-07-12 17:19:33
【问题描述】:
我对存储库模式非常陌生,但到目前为止我喜欢如何使用它。我在 codeplex 上找到了这个 implementation。我现在的问题是:
我是否以正确的方式使用存储库模式?
和
谁能为我下面的示例提供更好的解决方案?
这是一个示例(我正在使用 poco),其中我获取了一个在过程早期关闭延迟加载的位置。经过一些 ui 交互后,我想更新位置属性(例如名称)和相关用户(包括添加和删除):
using (var repo = RepositoryHelper.GetLocationRepository())
using (var repo2 = RepositoryHelper.GetUserRepository(repo.UnitOfWork))
{
repo.Add(location);
repo.UnitOfWork.Context.ObjectStateManager.ChangeObjectState(location, EntityState.Modified);
foreach (var user in location.Users)
{
repo2.Add(user);
if (user.Id != 0)
{
repo2.UnitOfWork.Context.ObjectStateManager.ChangeObjectState(user, EntityState.Unchanged);
}
}
foreach (var user in _remove.Where(user => user.Id != 0))
{
repo2.Delete(user);
}
repo2.UnitOfWork.Commit();
}
该示例正在运行,尽管我对如何使用 Attach 命令感到非常困惑。我认为如果对象来自另一个上下文,则使用它?!但是如果我尝试这样做,我总是会得到一个异常,即该对象正在被另一个上下文使用。可以说,我正在分离位置,之后我无法访问用户集合。
另一个问题(我认为它与此密切相关):我一直读到,数据库连接应该尽可能短。因此,我将 IDisposable 接口添加到存储库中,因此我可以以与 ObjectContext 相同的方式使用它们。但是我发现了一些示例(我认为也在 wpf 应用程序框架中),这不是通常的方法。那么,我应该遵循什么词呢?
亲切的问候,
马特
【问题讨论】:
标签: .net entity-framework repository-pattern poco unit-of-work