创建objectset是一种使用实体模型的有效方法吗?

时间:2013-03-20 11:09:33

标签: .net entity-framework entity-framework-4

我对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中的所有实体加载到对象上下文中。这会导致任何性能问题吗?

有人能建议更好的方法吗? 谢谢。

1 个答案:

答案 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上的扩展方法:您执行完全相同的操作,但您只需使用上下文而无需一直创建所有这些存储库。