Nhibernate 具有实体框架的存储库模式4

Nhibernate 具有实体框架的存储库模式4,nhibernate,entity-framework-4,repository-pattern,Nhibernate,Entity Framework 4,Repository Pattern,我曾经将NHibernate与存储库接口一起使用 在EF中使用此模式的正确方式是什么? 对于RepositoryBase,如何实现此存储库接口 公共接口IRepository { T GetById(对象id); 作废保存(T实体); T[]GetAll(); 无效删除(T实体); } 它与任何其他ORM都没有太大区别。这里有一个例子:有几种方法(大多数方法非常相似,只是略有不同),因此我建议您进行一些研究,选择最适合您的方法 使用EF4,可以通过使用ObjectSet实现通用存储库。请看几篇可

我曾经将NHibernate与存储库接口一起使用

在EF中使用此模式的正确方式是什么?
对于
RepositoryBase
,如何实现此存储库接口

公共接口IRepository
{
T GetById(对象id);
作废保存(T实体);
T[]GetAll();
无效删除(T实体);
}

它与任何其他ORM都没有太大区别。这里有一个例子:

有几种方法(大多数方法非常相似,只是略有不同),因此我建议您进行一些研究,选择最适合您的方法

使用EF4,可以通过使用
ObjectSet
实现通用存储库。请看几篇可能有帮助的文章:


基本上,您的存储库与您的对象上下文有关。我唯一要做的更改是让您的GetAll返回IEnumerable,而不是类似于:

public class SomeObjectRepo : IRepository<SomeObject>
{
    SomeContext GetById(object id)
    {
        using(var context = new MyContext())
        {
            return context.SomeObjects.First(x=>x.id.Equals(id));
        }
    }

etc...
}
公共类SomeObjectRepo:IRepository
{
SomeContext GetById(对象id)
{
使用(var context=new MyContext())
{
返回context.SomeObjects.First(x=>x.id.Equals(id));
}
}
等
}
这是我的解决方案:


我喜欢这一点,因为它不会将存储库实例与对象上下文的特定实例耦合在一起,因此使用一些DI框架,我可以使我的所有存储库都是单实例。

出于某种原因,所有给出的示例都将集合公开为IQueryable或IEnumerable。EF4有一个用于此目的的接口—IObjectSet(如果您使用的是最新的CTP,则为IDbSet)

朱莉·勒曼(Julie Lerman)在这方面发表了大量文章,其中包括创建一个实现IObjectSet的模拟集,这样您就可以进行一些断开连接的单元测试


请看一看。您有一些详细信息。

似乎IObjectSet是特定于EF的,因此我不希望使用存储库模式。重点是,您不希望您的Irepository具有EF依赖性
public class SomeObjectRepo : IRepository<SomeObject>
{
    SomeContext GetById(object id)
    {
        using(var context = new MyContext())
        {
            return context.SomeObjects.First(x=>x.id.Equals(id));
        }
    }

etc...
}