我正在考虑使用EF 4开始一个新项目并阅读一些文章,我发现了一些关于EF的文章和存储库模式以及工作单元
(http://tdryan.blogspot.com/2011/03/another-entity-framework-4-repository_15.html和http://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
,所以我很难选择哪两种更好用。
答案 0 :(得分:32)
你的问题不是傻瓜! <{1}}和UnitOfWork
模式入门需要一些时间。
首先,让一些终端合适。 Repository
封装了一组操作并将它们组合在一起。因此,您可以在一个逻辑组中创建客户,产品和相应的订单。
UnitOfWork
为您提供单点访问实体,大多数情况下都有一些特定的方法来检索数据。
多个存储库可以在一个单独的事务中使用,这就是他们共享Repository
的原因。
在您发布的示例中,T4文件创建了一些UnitOfWork
接口。一个是readonly,其中包含选择实体的方法,但另一个Repository
包含Repository
和Add
等方法。
因此,如果要添加实体,则需要首先构造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上找到满足您需求的其他样品。