1

我对实体框架比较陌生。下面是我用于通用 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>():我假设这行代码将数据库中的所有实体加载到对象上下文中。这会导致任何性能问题吗?

任何人都可以提出更好的方法吗?谢谢你。

4

1 回答 1

2

先说你的第二个问题。objCtxt.CreateObjectSet<T>();不会数据库加载所有实体,它只是创建一个ObjectSet. 这是一个IQueryable所以当你开始查询它时它会加载实体。

现在第一个问题。一旦您决定使用通用存储库,这就是一种方法。一些备注:

  • entity.EntityKey可以为空。所以你也必须检查一下。
  • 您有一个在其中ObjectContext创建 an 的无参数构造函数。我总是会在存储库之外创建上下文(或通过 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();
    }
    

我说“一旦你决定使用通用存储库”是有原因的。是一个经常被引用的帖子,肯定会让你重新思考。

您的存储库方法也可能是扩展方法ObjectSet:您做的事情完全相同,但是您只需使用上下文,而不必一直创建所有这些存储库。

于 2013-03-20T16:09:00.060 回答