我曾经使用NHibernate和存储库接口。
在EF中使用此模式的正确方法是什么?
如何为RepositoryBase<T>
?
public interface IRepository<T>
{
T GetById(object id);
void Save(T entity);
T[] GetAll();
void Delete(T entity);
}
答案 0 :(得分:2)
由于某些原因,给出的所有示例都将集合公开为IQueryable或IEnumerable。 EF4有一个用于此目的的接口 - IObjectSet(如果您使用的是最新的CTP,则为IDbSet)。
Julie Lerman在这方面做了大量的文章,包括创建一个实现IObjectSet的MockSet,所以你可以做一些断开连接的单元测试
答案 1 :(得分:1)
它与其他任何ORM并没有太大的不同。这是一个例子:http://blogs.microsoft.co.il/blogs/gilf/archive/2010/01/20/using-repository-pattern-with-entity-framework.aspx
答案 2 :(得分:1)
答案 3 :(得分:0)
有几种方法(大多数方法非常相似,只是略有不同),所以我建议做一些研究,选择最适合你的方法。
使用EF 4,可以使用ObjectSet<T>
实现通用存储库。看一些可能有用的文章:
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框架,我可以让我所有的存储库都是单例。