2012-03-22 72 views
5

几天前我阅读关于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。我使用网络表单,并安装了EntityFramework CTP4软件包。 (我不能使用EF 5)。EntityFramework 4,DbSet和ObjectContext

我想为我的项目代码库的通用,但我被困在这条线:

this.dbSet = context.Set<TEntity>(); 

我知道这行不工作,因为在我的项目和数据库第一种方法使用一个ObjectContext的。我该如何处理它?我可以编写通用存储库,而不首先迁移到代码(在我的情况下,这不是一个选项)?

回答

7

这是ObjectContext的等价的:

this.dbSet = context.CreateObjectSet<TEntity>(); 

现在,这将创建一个ObjectSet<TEntity>而非DbSet<TEntity>,但对于你的模式,你可以以同样的方式使用它。

UPDATE

ObjectSet类没有这样的实用方法DbSetFind()方法匹配。为了“按键获取”,您需要构建一个EntityKey并使用ObjectContext.GetEntityByKey(),不幸的是这不是一件非常简单的事情。

真的没有一个简单的方法来解决这个问题,我找到了。在我的情况下,我所做的是将所有实体从一个普通的类(使​​用自定义T4模板生成模型中的类)中进行建立。然后,我可以添加通用约束到我的资料库,如:

public class MyRepository<TEntity> where TEntity : MyEntityBaseClass 

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

return myObjectSet.SingleOrDefault(x => x.Id == myId); 

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

+0

感谢您的帮助。 现在这将创建一个ObjectSet 而不是一个DbSet ,但对于您的模式,您可以以相同的方式使用它。 我在这行找到方法有问题: dbSet.Find(id); 我如何使用ObjectSet对其进行编码? – mrrobot 2012-03-22 19:19:58

+0

因此,如果在ObjectSet中通过Id查找这么困难,为什么不使用DbContext?我想知道应该使用哪种方法,尝试创建find方法,或者我应该使用DbContext?到目前为止,在这个项目中我还没有写太多代码,所以使用DbContext可能更好?你能否提出你的看法?谢谢 – mrrobot 2012-03-22 21:23:45

+0

在我开始申请时,EF Code First还没有发布。根据Ropstah的回答,它看起来有些模板可用于为Model First或Database First应用程序生成Code First样式类。我从来没有尝试过这种方法,所以我真的无法说出它是否有效。 – CodingGorilla 2012-03-23 02:43:02

4

1.您希望将DbContextGenerator模板添加到您的Visual Studio模板:

DbContextGenerator template

2.在这之后请务必清除出默认生成工具您.edmx文件。

Code generation tool

3.现在你的愿望可以实现了GenericRepository模式。