使用存储库模式与EF 4.1数据库第一种方法

时间:2011-11-07 13:22:18

标签: entity-framework entity-framework-4 repository-pattern ef-database-first

这可能吗?

有没有例子?到目前为止,我的搜索已证明无效......

我使用这种方法的原因是因为我必须为我的MVC 3应用程序坚持遗留数据库,但是有一些非常复杂的关联和继承层次结构,所以我希望EF生成映射而不是我手动执行。我想使用Repository模式进行单元测试。 任何建议表示赞赏。

3 个答案:

答案 0 :(得分:2)

如果您只搜索“存储库模式实体框架4.1”或其他内容并忘记术语“数据库优先”,您的搜索将会变得富有成效。如果您手动编写类(Code First)或通过DbContext Generator(数据库/模型优先)生成它们并不重要。最后,您的存储库将使用这些类。没有生成器可以为您编写有意义的存储库 - 除了模型的DbSet s,它们是通用存储库的特化。您必须根据模型类和业务需求手动编写。

因此,无论您遵循Code First还是Database / Model First方法,它都不会影响存储库的设计。

关于使用EF和单元测试的存储库模式我建议将其作为警告和起点阅读,并按照该答案中的大量链接进行操作:

Repository Pattern with Entity Framework 4.1 and Parent/Child Relationships

答案 1 :(得分:2)

如果需要,您仍然可以使用代码优先样式:代码优先允许您从现有数据库进行反向工程以帮助您入门。或者,如果您已经拥有EDMX,则可以使用T4模板(使用EF 4.1打包)生成代码优先类。或者,再次使用T4模板生成POCO并将数据库优先保留为策略。

但我认为即使使用数据库优先风格,您仍然可以轻松实现存储库模式。我认为你的主要问题是依赖于某些实体框架DLL(如果你这样做)(你可以决定它不是问题)。

答案 2 :(得分:0)

我知道这篇文章是迟到的一天,可能短了一美元。但到目前为止,我已经通过在我的控制器中创建我的DbContext实例并将其传递到我的Repository实例中,在数据库优先实现Repository Pattern。然后我确保我的存储库中的方法在必要时返回我的对象​​的类型。

在以这种方式使用Repository时遇到了两个主要问题。 首先,我的控制器上的默认Dispose方法存在问题。因为我在我的存储库中调用了DbContext,所以我必须继承IDisposable并在那里实现Dispose方法。 我用这个教程作为例子 http://csharppulse.blogspot.in/2013/09/learning-mvc-part-6-generic-repository.html

我遇到的下一个问题是什么时候更新我的对象。 因为我已经传入了DbContext,所以我的对象已经存在了。因此,我必须使用逻辑来设计我的更新方法,以查看它是否已经存在。 我用这篇文章来帮助解决这个问题 An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key