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

时间:2010-08-01 19:45:41

标签: nhibernate entity-framework-4 repository-pattern

我曾经使用NHibernate和存储库接口。

在EF中使用此模式的正确方法是什么?
如何为RepositoryBase<T>

实现此存储库界面
public interface IRepository<T>
{
    T GetById(object id);
    void Save(T entity);
    T[] GetAll();
    void Delete(T entity);
}

6 个答案:

答案 0 :(得分:2)

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

Julie Lerman在这方面做了大量的文章,包括创建一个实现IObjectSet的MockSet,所以你可以做一些断开连接的单元测试

http://thedatafarm.com/blog/data-access/agile-entity-framework-4-repository-part-6-mocks-amp-unit-tests/

答案 1 :(得分:1)

答案 2 :(得分:1)

查看Entity Framework Repository & Unit of Work Template。您有一些详细信息here

答案 3 :(得分:0)

有几种方法(大多数方法非常相似,只是略有不同),所以我建议做一些研究,选择最适合你的方法。

使用EF 4,可以使用ObjectSet<T>实现通用存储库。看一些可能有用的文章:

http://devtalk.dk/2009/06/09/Entity+Framework+40+Beta+1+POCO+ObjectSet+Repository+And+UnitOfWork.aspx

http://www.forkcan.com/viewcode/166/Generic-Entity-Framework-40-Base-Repository

答案 4 :(得分:0)

你基本上让你的存储库与对象上下文对话。只有改变我会让你的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...
}

答案 5 :(得分:0)

这是我的解决方案:http://www.necronet.org/archive/2010/04/10/generic-repository-for-entity-framework.aspx

我喜欢这个,因为它没有将存储库的实例与对象上下文的特定实例相结合,所以对于一些DI框架,我可以让我所有的存储库都是单例。