我曾经使用NHibernate的存储库接口。存储库模式与实体框架4
在EF中使用此模式的正确方法是什么?
如何才能实现这个存储库接口,为RepositoryBase<T>
?
public interface IRepository<T>
{
T GetById(object id);
void Save(T entity);
T[] GetAll();
void Delete(T entity);
}
我曾经使用NHibernate的存储库接口。存储库模式与实体框架4
在EF中使用此模式的正确方法是什么?
如何才能实现这个存储库接口,为RepositoryBase<T>
?
public interface IRepository<T>
{
T GetById(object id);
void Save(T entity);
T[] GetAll();
void Delete(T entity);
}
这不是一个真正的很多不同于任何其他ORM。这里有一个例子:http://blogs.microsoft.co.il/blogs/gilf/archive/2010/01/20/using-repository-pattern-with-entity-framework.aspx
有几种方法(大多数都很相似,只是略有不同),所以我建议你做一些研究并选择最适合你的方法。
使用EF 4可以通过使用ObjectSet<T>
来实现通用存储库。看看几篇文章,这可能有助于:
http://www.forkcan.com/viewcode/166/Generic-Entity-Framework-40-Base-Repository
你基本上你的资料库说话哟你的对象范围内。只有改变我会做将让您的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...
}
这是我的解决方案:http://www.necronet.org/archive/2010/04/10/generic-repository-for-entity-framework.aspx
我喜欢这个,因为它确实库不夫妇实例与具体实例对象上下文,所以在一些DI框架中,我可以将所有存储库都设置为单例。
由于某些原因,所有示例都将集合公开为IQueryable或IEnumerable。 EF4有一个用于此目的的接口 - IObjectSet(如果您使用最新的CTP,则为IDbSet)。
朱莉·勒曼有这样做,包括创建一个MockSet实现IObjectSet一个巨大的岗位,这样你就可以做一些断开的单元测试
看起来像IObjectSet是EF特定的,因此我不喜欢存储库模式。要点是你不希望你的Irepository具有EF依赖 – Gluip 2011-07-24 11:00:03