我对Entity Framework相对较新。下面是我用于通用CRUD功能的代码。
internal class clsRepository<T> where T : EntityObject
{
private ObjectContext objCtxt;
private ObjectSet<T> objSet;
public clsRepository()
{
objCtxt = new DAL.Entities();
objSet = objCtxt.CreateObjectSet<T>();
}
public clsRepository(ObjectContext context)
{
objCtxt = context;
objSet = objCtxt.CreateObjectSet<T>();
}
public T AddEntity(T entity)
{
objSet.AddObject(entity);
objCtxt.SaveChanges();
return entity;
}
public void UpdateEntity(T entity)
{
object ent;
if (!objCtxt.TryGetObjectByKey(entity.EntityKey, out ent))
{
objSet.Attach(entity);
objCtxt.ObjectStateManager.ChangeObjectState(entity, System.Data.EntityState.Modified);
}
else
{
objCtxt.ApplyCurrentValues<T>(entity.EntityKey.EntitySetName, entity);
}
objCtxt.SaveChanges();
}
public void DeleteEntity(T entity)
{
object ent;
if (!objCtxt.TryGetObjectByKey(entity.EntityKey, out ent))
{
objSet.Attach(entity);
objCtxt.ObjectStateManager.ChangeObjectState(entity, System.Data.EntityState.Deleted);
}
objSet.DeleteObject(entity);
objCtxt.SaveChanges();
}
}
1)这是使用实体模型的有效方式吗?
2)
objCtxt.CreateObjectSet<T>()
:我假设这行代码将db中的所有实体加载到对象上下文中。这会导致任何性能问题吗?
有人能建议更好的方法吗? 谢谢。
答案 0 :(得分:2)
你的第二个问题。 objCtxt.CreateObjectSet<T>();
不从数据库加载所有实体,只创建ObjectSet
。这是IQueryable
,因此当您开始查询时它会加载实体。
现在是第一个问题。一旦您决定使用通用存储库,这是一种方法。一些评论:
entity.EntityKey
可以为null。所以你必须检查一下。ObjectContext
。我总是在存储库外部创建上下文(或通过IoC容器注入它),因为在涉及多个存储库的作业中,您希望有一个上下文实例,并且您当然不想要混合存储库共享上下文和具有自己上下文的上下文。这也意味着您最好删除SaveChanges()
来电。模式将是:
using (var ctx = new DAL.Entities();
{
var repo1 = new clsRepository<A>(ctx);
....
var repo2 = new clsRepository<B>(ctx);
....
if (// no error )
ctx.SaveChanges();
}
我说“一旦你决定使用通用存储库”是有原因的。 This是一篇经常被引用的帖子,肯定会给你第二个想法。
您的存储库方法也可能是ObjectSet
上的扩展方法:您执行完全相同的操作,但您只需使用上下文而无需一直创建所有这些存储库。