这可能吗?
有没有例子?到目前为止,我的搜索被证明是徒劳的......
我使用这种方法的原因是因为我必须坚持使用 MVC 3 应用的旧数据库,但有一些非常复杂的关联和继承层次结构,因此我希望 EF 生成映射而不是我手动执行此操作。我想使用存储库模式进行单元测试。任何建议表示赞赏。
如果您只搜索"存储库模式实体框架 4.1"或其他内容而忘记术语"数据库优先",您的搜索将变得富有成效。无论是手动编写类(代码优先(还是通过 DbContext 生成器(数据库/模型优先(生成类,都没有关系。最后,您的存储库将使用这些类。没有生成器也可以为您编写有意义的存储库 - 除了模型的DbSet
,它们是通用存储库的专用化。您必须根据模型类和业务需求手写它。
因此,无论您遵循代码优先还是数据库/模型优先方法,它都不会影响存储库的设计。
关于使用 EF 和单元测试的存储库模式,我建议将其作为警告和起点阅读,并遵循该答案中的大量链接:
具有实体框架 4.1 和父/子关系的存储库模式
如果需要,您仍然可以使用代码优先样式:代码优先允许您从现有数据库进行逆向工程以帮助您入门。 或者,如果已有 EDMX,则可以使用 T4 模板(随 EF 4.1 打包(生成代码优先类。 或者,再次使用 T4 模板生成 POCO,并将数据库优先作为策略。
但我认为即使使用数据库优先样式,您仍然可以轻松实现存储库模式。 我认为如果您这样做,您的主要问题将在于对某些实体框架 DLL 的依赖(您可以决定这不是问题(。
我知道这篇文章晚了一天,可能还差一美元。但到目前为止,通过在控制器中创建 DbContext 的实例并将其传递到我的存储库实例中,我运气很好,首先在数据库上实现了存储库模式。然后,我确保存储库中的方法在必要时返回 my 对象的类型。
以这种方式使用存储库时,我遇到了两个主要问题。首先,我的控制器上的默认 Dispose 方法遇到了问题。由于我在存储库中调用了 DbContext,因此我必须继承 IDisposable 并在那里实现 Dispose 方法。我用本教程作为一个例子http://csharppulse.blogspot.in/2013/09/learning-mvc-part-6-generic-repository.html
我遇到的下一个问题是何时需要更新我的对象。因为我在 DbContext 中传递了,所以我的对象已经存在。因此,我必须使用逻辑来设计我的更新方法,以查看它是否已经存在。我用这篇文章来帮助解决这个问题具有相同键的对象已存在于 ObjectStateManager 中。对象状态管理器不能使用相同的键跟踪多个对象