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

本文关键字:保存 实体 对象 实例 一个 上下文 | 更新日期: 2023-09-27 18:33:40

我的问题如下。我有一个带有 DalClass 的 DataAccessLayer 项目。在这个 Dal 类中,我有许多使用实体框架进行操作的方法。例如,一些伪代码来展示我们如何做到这一点。

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 中有一个方法来获取实体对象列表,如下所示:

    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();
        }
    }

将列表返回到我的业务层类之后。我对每个实体对象、计算、更改一些属性值等进行了一些更改。之后,我从我的业务层类调用一个方法来使用此方法保存新编辑的列表:

    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. 问题我无法保存我在业务层中编辑的 newEntityObjectList。显然这是行不通的。

    entityObjectList = newEntityObjectList;

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

  1. 问题我必须两次触发此查询

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

解决方案 2.问题可能是如果我为GetEntityObjectsByIds((和UpdateEntityObjects((使用一个上下文实例。但是在我们所有的达尔课程中,我们都避免了这一点。即使我使用上下文类的一个实例,这也不能解决问题 1。那么如何保存 newEntityObjectList 呢?

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

好吧,我的 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; }
} 

保持简单...