实体框架+存储库+工作单元

时间:2012-01-04 04:33:48

标签: c# entity-framework design-patterns repository unit-of-work

我正在考虑使用EF 4开始一个新项目并阅读一些文章,我发现了一些关于EF的文章和存储库模式以及工作单元

http://tdryan.blogspot.com/2011/03/another-entity-framework-4-repository_15.htmlhttp://blogs.msdn.com/b/adonet/archive/2009/06/16/using-repository-and-unit-of-work-patterns-with-entity-framework-4-0.aspx

我正在使用第一个(第1部分,第2部分和第3部分)。它们非常相似。

我是这个场景中的新手。我在这两个帖子之间感到困惑。我已经创建了所有内容,但我不知道如何开始使用上下文并添加一些实体。我发布了第二个链接,因为发布了实现它的方法。 ObjectContext源自IUnitOfWork,所以我很难选择哪两种更好用。

2 个答案:

答案 0 :(得分:32)

你的问题不是傻瓜! <{1}}和UnitOfWork模式入门需要一些时间。

首先,让一些终端合适。 Repository封装了一组操作并将它们组合在一起。因此,您可以在一个逻辑组中创建客户,产品和相应的订单。

UnitOfWork为您提供单点访问实体,大多数情况下都有一些特定的方法来检索数据。

多个存储库可以在一个单独的事务中使用,这就是他们共享Repository的原因。

在您发布的示例中,T4文件创建了一些UnitOfWork接口。一个是readonly,其中包含选择实体的方法,但另一个Repository包含RepositoryAdd等方法。

因此,如果要添加实体,则需要首先构造Delete,然后为您使用的实体类型(UnitOfWork或{{1}实例化Repository } 例如)。然后,您可以使用CustomerRepository方法将实体添加到ProductRepository。完成存储库操作后,可以调用Add将更改保存到数据库中。

Repository

在您发布的示例中,使用了使用StructureMap的依赖注入。这是一个完整的其他主题,但这意味着您不直接构造UnitOfWork.Commit()IUnitOfWork unitOfWork = new EFUnitOfWork(); IRepository<Customer> customerRepository = new CustomerEFRepository(unitOfWork); Customer c = new Customer(); // init customer customerRepository.Add(c); unitOfWork.Commit(); ,而是使用您设置的某些配置将它们“注入”代码。

答案 1 :(得分:1)

如果您的项目是Web,请创建一个处理程序,在请求中启动事务并在最后一步结束它。

我认为可以在这里找到一个更简单的例子:https://github.com/ayende/CourseSampleApp 您还可以在nhibernate上找到满足您需求的其他样品。