前几天我读了关于GenericRepository和Unit Of Work模式http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application的教程。我使用Web表单,我安装了EntityFramework CTP4包。 (我不能使用EF 5)。
我想为我的项目编写通用存储库代码,但我被困在这一行:
this.dbSet = context.Set<TEntity>();
我知道这行不起作用,因为在我的项目和数据库中首先使用ObjectContext。我怎么处理它?我可以编写通用存储库而无需先迁移到代码(在我的情况下这不是一个选项)吗?
答案 0 :(得分:7)
这与ObjectContext相同:
this.dbSet = context.CreateObjectSet<TEntity>();
现在这会创建一个ObjectSet<TEntity>
而不是DbSet<TEntity>
,但对于您的模式,您可以以相同的方式使用它。
<强>更新强>
ObjectSet
类没有与Find()
的{{1}}方法匹配的实用方法。为了“按键获取”,您需要构建DbSet
并使用ObjectContext.GetEntityByKey()
,不幸的是,这不是一件非常简单的事情。
我发现,确实没有一种简单的方法可以解决这个问题。在我的例子中,我所做的是将所有实体建立在公共类的基础上(使用自定义T4模板从模型中生成类)。然后我可以在我的存储库中添加一个通用约束,例如:
EntityKey
然后我的公共基类有一个public class MyRepository<TEntity> where TEntity : MyEntityBaseClass
字段,它由所有实体继承,所以我可以简单地做:
Id
我确信还有其他方法,这可能是另一个问题的好主题。
答案 1 :(得分:4)
<强> 1。您想将DbContextGenerator
模板添加到visual studio模板中:
<强> 2。在此之后,请确保清除.edmx
文件中的默认生成工具。
第3。现在,您可以根据需要实施GenericRepository
模式。