3 c# entity-framework repository-pattern generic-repository
在我工作的公司,我被命令更新旧的MVC应用程序并实现SQL数据库的存储库模式.我使用Entity Framework Database-First创建了数据库的上下文,并获得了23个实体.
我是否需要为每个实体创建存储库或为上下文实现通用存储库?我问这个是因为我在搜索互联网时发现了以下内容:
每个域一个存储库
您应该将存储库视为内存中域对象的集合.如果您正在构建名为Vega的应用程序,则不应具有如下所示的存储库:
public class VegaRepository {}
通用存储库是否适用于Entity Framework Database-First?这是因为我在搜索互联网时发现了以下内容:
实体框架
请注意,只有在首先使用代码映射的POCO时,存储库模式才有用.否则你只需要用实体打破抽象(=存储库模式不是很有用).如果您想为自己生成基础,可以按照本文进行操作.
Ami*_*shi 11
首先,如果您使用完整的ORM,如Entity Framework或NHibernate,您应该避免实现额外的存储库和工作单元层.这是因为; ORM本身暴露了通用存储库和工作单元.
在EF的情况下,您DbContext的工作单位DbSet是通用存储库.在NHibernate的情况下,它ISession本身.
在相同的现有存储库上构建Generic Repository的新包装器是重复工作.为什么重新发明轮子?
但是,有些人认为在调用代码中直接使用ORM会产生以下问题:
除了上述所有内容之外,一般性讨论的另一个问题是"如果我们决定在未来改变ORM会怎么样".这不应该是决定时的关键点,因为:
考虑到上面提到的四个问题,即使您正在使用完整的ORM,也可能需要创建存储库 - 这是根据每个案例的决定.
即使在这种情况下,也必须避免使用通用存储库.它被认为是一种反模式.
为什么通用存储库是反模式的?
GetById(),标识符类型可能不同.我建议你阅读这些(1,2,3,4,5)的文章解释了为什么通用存储库是一个反模式.这等回答论述了一般Repository模式.
所以,我会建议:
在任何情况下,都不要将Generic Repository暴露给调用代码.
另外,不要IQueryable从具体的存储库返回.这违反了存储库存在的基本目的 - 抽象数据访问.随着IQueryable在存储库外部暴露,许多数据访问决策泄漏到调用代码中,而存储库失去对它的控制.
我是否需要为每个实体创建存储库或为上下文实现通用存储库
如上所述,为每个实体创建存储库是更好的方法.请注意,Repository理想情况下应返回Domain Model而不是Entity.但这是讨论的不同主题.
通用存储库是否适用于EF Database First?
如上所述,EF本身公开了Generic Repository.在它上面再建一层是没用的.你的形象说同样的话.
| 归档时间: |
|
| 查看次数: |
1384 次 |
| 最近记录: |