EntityFramework 4,DbSet和ObjectContext

gee*_*eek 5 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>();
Run Code Online (Sandbox Code Playgroud)

我知道这行不起作用,因为在我的项目和数据库中首先使用ObjectContext.我怎么处理它?我可以编写通用存储库而无需先迁移到代码(在我的情况下这不是一个选项)吗?

Cod*_*lla 7

这与ObjectContext相同:

this.dbSet = context.CreateObjectSet<TEntity>();
Run Code Online (Sandbox Code Playgroud)

现在这创建了一个ObjectSet<TEntity>而不是一个DbSet<TEntity>,但对于您的模式,您可以以相同的方式使用它.

UPDATE

ObjectSet班没有一个实用程序方法一样,比赛Find()的方法DbSet.为了"按键获取",你需要构建一个EntityKey并使用它ObjectContext.GetEntityByKey(),遗憾的是,这并不是一件非常简单的事情.

我发现,确实没有一种简单的方法可以解决这个问题.在我的例子中,我所做的是将所有实体建立在公共类的基础上(使用自定义T4模板从模型中生成类).然后我可以在我的存储库中添加一个通用约束,例如:

public class MyRepository<TEntity> where TEntity : MyEntityBaseClass
Run Code Online (Sandbox Code Playgroud)

然后我的公共基类有一个Id由所有实体继承的字段,所以我可以简单地做:

return myObjectSet.SingleOrDefault(x => x.Id == myId);
Run Code Online (Sandbox Code Playgroud)

我确信还有其他方法,这可能是另一个问题的好主题.