抽象对Entity-Framework的访问

时间:2011-06-03 23:25:07

标签: entity-framework asp.net-mvc-3 linq-to-entities

我在EF中有一个名为Registry的实体,用于抛出各种有用的东西。我的典型查询如下所示:

db.Registry
   .Where(x => x.Domain == "SomeDomain" && x.Key == "SomeKey")
   .Select(x => x.Value)
   .Single();

其中dbEFContainer类型的变量。我不想在整个地方进行这种查询,而是想写一些更简单的东西,或许像:

Registry.Get(Key: "SomeKey", Domain: "SomeDomain")

但问题是,为了让该方法访问数据库,它需要实例化EFContainer,当它发生时,我开始有错误,IEntity更改跟踪器无法处理第二个连接。我想我可以将我的db变量传递给方法,但这是非常的。

实现这一目标的好方法是什么?

1 个答案:

答案 0 :(得分:3)

执行此操作的典型方法是创建RegisterRepository并将EFContainer注入存储库的构造函数或注入创建容器的机制。

public class RegistryRepository {
public RegistryRepository(EFContainer db) {
  this.db = db;
}

readonly EFContainer db;

public Registry Get(string domain, string key) {
// implementation here
}

}

在此实现中,您必须考虑如何获取对存储库的引用,以及如何构建存储库。您可以使用dependency injection框架来注册EF容器和具有适当生命周期范围的存储库。例如,如果您正在开发ASP.NET应用程序,则EF上下文将由HTTP请求确定范围,就像存储库一样。