EntityFramework 4,DbSet和ObjectContext

时间:2012-03-22 12:51:39

标签: entity-framework objectcontext

前几天我读了关于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。我怎么处理它?我可以编写通用存储库而无需先迁移到代码(在我的情况下这不是一个选项)吗?

2 个答案:

答案 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模板中:

DbContextGenerator template

<强> 2。在此之后,请确保清除.edmx文件中的默认生成工具。

Code generation tool

第3。现在,您可以根据需要实施GenericRepository模式。