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