具有实体框架的存储库模式

Ras*_*sto 20 .net asp.net-mvc entity-framework repository repository-pattern

存储库模式用于从特定数据库和对象关系映射技术(如EF)中抽象使用.因此,如果我决定这样做,我可以在将来轻松替换(例如)我的实体框架映射与Linq to SQL.

但是当我使用EF时,我从模型中获得了我的实体类 - 也就是说它们是从该可视化图中生成的.如果我在我的存储库中使用这个生成的实体类,然后决定用其他东西替换EF,那么我将删除那个可视化实体图,这也意味着删除类吧?

我要解决的问题是我的存储库将依赖于实体框架,即数据访问层,因为它将使用EF生成的类.

如何删除此依赖项?

另请注意,我使用EF主要是因为它能够从该可视化图生成所有内容 - 我只是设计图表并让它为我生成所有外键等数据库.我非常喜欢,甚至不想想想SQL命令.

Lad*_*nka 28

存储库始终依赖于数据访问技术.这就是人们使用存储库的原因 - 将数据访问依赖性包装到单独的层.如果您决定更改数据访问技术(例如,您有1%的可能性),则必须创建新的存储库,以实现与以前相同的接口.

引入repositoris将增加一层新的复杂性.存储库有其优点和缺点.引入它们只是因为"你可以在将来改变数据访问方法"是一个不好的理由.不要因为可能发生的事情而设计您的应用程序.根据当前的实际需求(敏捷方式)设计应用程序,并在需要更改时重构代码 - 这是如何在市场中保持竞争力的唯一方法.功能是出售您的SW而不是其开放式架构用于任何类型的更改(好的,有例外但在这种情况下开放式架构是顶级要求).

使用EF时,您有多种选择如何创建实体:

  • 使用cutom工具生成实体对象.这是为EDMX创建"代码隐藏"文件的默认方法.它是EFv1(.NET 3.5 SP1)中唯一可用的解决方案.
  • 使用T4模板生成实体对象,POCO,STE或任何自定义实体类型(您可以修改生成逻辑).这通常与EFv4一起使用.
  • 自己写POCO.这可以与EFv4一起使用,并且始终与EF 4.1中的代码优先使用方法一起使用.

如果您希望将来可以更改数据访问技术,请使用POCO的第二种或第三种方法.对于T4模板,您只需复制生成的POCO或修改项目文件,这样在删除EDMX文件后就不会丢失它们.

如果您不确定第二种或第三种方法是否适合您,请检查我对这些问题的回答:

因为我在某种程度上同意@Patko的回答,你也应该查看Ayende的博客.他撰写了几篇关于使用存储库和架构应用程序的文章.他正在撰写关于NHibernate的文章,但可以用EF做出类似的解决方案.唯一的区别是NHibernate提供了更好的抽象,因此直接使用NHibernate的代码更易于测试.


Pat*_*tko 9

能够从一个持久性技术切换到另一个持久性技术很好,但是你真的需要它吗?

首先,什么是存储库?根据Fowler的定义,它提供了对域对象的内存中集合访问.但是每个现代ORM工具都已经这样做了,因此另一层抽象只会增加一点复杂性.

其次,从一种持久性技术切换到另一种持久性技术通常比提供另一种存储库实现更复杂.例如,您打算如何处理交易?事务通常依赖于上下文并在存储库之外处理.您当然可以使用某种工作单元实现,但是您必须为每种持久性技术实现新的工作单元.

我并不是说你不应该使用存储库,只是可能再考虑一下.

  • +1因为我同意它.存储库被过度使用,并且在任何现有的ORM工具存在之前就已经定义了存储库. (3认同)
  • 也许您可以访问Ayende的博客http://ayende.com/Blog/default.aspx.他是存储库模式的支持者之一,但他改变了主意.它始于http://ayende.com/Blog/archive/2009/04/17/repository-is-the-new-singleton.aspx博文.他的最新帖子也提供了一些关于如何做的想法.对于`ObjectContext`,我不明白为什么不.如果您通过存储库会感觉更好吗?只需将`ObjectContext`看作一种存储库:) (3认同)

Nel*_*eis 6

由EF的设计者创建的实体类存在于您的项目中,位于"Model.Designer.cs"中.您可以复制代码,以便即使从EF删除模型或引用,您的实体仍保留在项目中.但是,它们与EF紧密耦合,因此您应该努力将EF与实体类分离.

到目前为止,你有T4模板可以帮助你解耦,但他们仍然需要对所选T4进行一些更改:

  • ADO.NET EntityObject Generator
  • ADO.NET POCO实体生成器
  • ADO.NET自我跟踪实体生成器

EF4.1带来了一个简化的API DbContext,当您想要解耦实体类时,它可以改善您使用EF的体验.使用EF4.1,您可以获得3种方法:

  • 代码优先
    • 你创建了类,EF创建了它应该是的数据库
    • 删除对EF的引用时,类不会消失
    • 你不会有任何设计师
  • 数据库优先
    • 如果您已有数据库,将在设计器上为您创建模型
    • 您可以使用新的T4模板DbContext Generator创建实体类
  • 模型第一
    • 正如您现在所做的那样,您可以在设计器中创建模型
    • 您可以使用DbContext Generator创建实体类

现在,回答你的问题:

如何删除此依赖项?

  1. 安装EF4.1
  2. 创建模型(使用模型优先方法)
  3. 从模型生成数据库
  4. 使用DbContext Generator生成实体类

了解如何在此处完成所有这些:EF 4.1模型和数据库第一次演练.
您应该阅读ADO.NET团队博客中的系列 文章在EF Feature CTP5第1部分:简介和模型 (EF4.1以前称为EF Feature CTP5)中使用DbContext.
您可以在我的问题中获得更多详细信息:仅限EF POCO代码VS EF POCO和实体数据模型.