使用一个上下文的多个实例保存对EntityObject的更改

时间:2014-12-08 21:05:59

标签: c# entity-framework entity-framework-6

我的问题如下。 我有一个带有DalClass的DataAccessLayer项目。在这个Dal类中,我有许多使用Entity Framework进行操作的方法。例如,一些伪代码来说明我们是如何做到的。

class DalClass
{    
    public void SetEntityObject(EntityObject entityObject)
    {
        using (var context = new Entities())
        {
            context.EntityObjectSet.Attach(entityObject);
            context.ChangeTracker.DetectChanges();
            foreach (var entity in context.ChangeTracker.Entries())
            {
                entity.State = entityObject.EntityState;
            }

            context.SaveChanges();
        }
    }

    public EntityObject GetEntitObject(Guid id)
    {
        EntityObject result;
        using (var context = new Entities())
        {
            result = context.EntityObjectSet.Where(x => x.Id == Id);  
        }

        return result;
    }
}

每次我们使用EF进行操作时,我们都会创建一个新的实例上下文并做一些工作。我的问题是我在我的DalClass中有一个方法来获取EntityObjects列表,如下所示:

    public List<EntityObject> GetEntityObjectsByIds(List<Guid> idList)
    {
        using (var context = new Entities())
        {
            var query = from entityObject in context.EntityObjectSet
                        where idList.Contains(entityObject.Id)
                        select entityObject;

            return query.ToList();
        }
    }

将List返回到Business Layer类后。我对每个EntityObject做了一些更改,计算,更改了一些属性值等等。之后,我从我的BusinessLayer类调用一个方法,用这个方法保存新编辑的List:

    public void UpdateEntityObjects(List<EntityObject> newEntityObjectList)
    {
        using (var context = new Entities())
        {
            var idList = entityObjectList.Select(x => x.Id).ToList();

            var query = from entityObject in context.EntityObjectSet
                        where idList.Contains(entityObject.Id)
                        select entityObject;

            var entityObjectList = query.ToList();
            entityObjectList = newEntityObjectList;

            context.ChangeTracker.DetectChanges();
            foreach (var entity in context.ChangeTracker.Entries())
            {
                entity.State = EntityState.Modified;
            }
            context.SaveChanges();
        }
    }
  1. 问题 我无法保存我在BusinessLayer中编辑的newEntityObjectList。显然这不起作用。

    entityObjectList = newEntityObjectList;

  2. 那么保存newEntityObjectList的最佳方法是什么?

    1. 问题 我必须两次查询这个问题

                  var query = from entityObject in context.EntityObjectSet
                          where idList.Contains(entityObject.Id)
                          select entityObject;
      
    2. 解决方案2.问题可能是我为GetEntityObjectsByIds()和UpdateEntityObjects()使用一个Context实例。但在我们所有的Dal课程中,我们避免了这一点。即使我使用Context类的一个实例,这也不能解决问题1.那么如何保存newEntityObjectList?

1 个答案:

答案 0 :(得分:1)

好吧,我的DAL课肯定是这样的:

class EntityObjectDAL 
{
    private ObjectContext/DbContext context = new ObjectContext/DbContext();

    public List<EntityObject> GetObjects() { return context.EntityObjects.ToList(); }
    // Tracked by context. Just change it in BL

    public void SaveObjects() { context.SaveChanges(); }
    // Just call SaveChanges(), no need for anything special...

    public void InsertObject(EntityObject eo) { context.EntityObjects.Add(eo); }

    public void UpdateObject(EntityObject eo) { context.Entry(eo).State = EntityState.Modified; }
} 

保持简单......