这可能吗?
有没有例子?到目前为止,我的搜索已证明无效......
我使用这种方法的原因是因为我必须为我的MVC 3应用程序坚持遗留数据库,但是有一些非常复杂的关联和继承层次结构,所以我希望EF生成映射而不是我手动执行。我想使用Repository模式进行单元测试。 任何建议表示赞赏。
答案 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