如何在实体框架中同步依赖关系?

时间:2017-04-27 18:46:36

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

我有一个包含一对多关系的两个表的数据库。 父亲(FatherId)和孩子(ChildId,FatherId)。我创建了实体框架 这两个表的实体。

这两个表中填充了正确关系中的一些值。 我不时从外部数据源进行更新同步。我需要的是为父亲刷新所有孩子。一些被添加,一些被删除。

一个特殊情况是悲伤的原因。假设一个父亲有孩子[A,B,C],同一个父亲的进口数据有孩子[B,C,D]。我发现没有从数据库中删除子A导致数据损坏。虽然我已正确填充了father.Childs集合。 我想出了一个我觉得很麻烦的解决方法。在下面的代码中解释。

    private void InsertOrUpdate(Father father)
    {
        var id = father.FatherId;
        if (mContext.Fathers.Any(f => f.FatherId == id))
        {
            mContext.Fathers.Attach(father);
            mContext.ObjectStateManager.ChangeObjectState(father, EntityState.Modified);
        }
        else
        {
            mContext.Fathers.AddObject(father);
        }
    }


    // this method syncronizes outer data wtih DB
    private void handleFather(Result.Product resultProduct, ref int gtinCnt)
    {
            Father father= new Father();
            father.FatherId = ImportedData.FatherId;     // data form outer source
            Father.other data = ImportedData.otherdata; // some other stuff not important
            InsertOrUpdate(father);
            // father should be attached now
            // Because it does not correctly synchronize missing children (which are absent in outer data) I have to remove them "manualy"
            // This is the cumersome bit. I do not like I have to delete all Childs by myself. Why cannot entity framework correctly update DB from Father.Childs collection.
            foreach (var child in father.Childs.ToList()) 
                mContext.Childs.DeleteObject(child);
            mContext.SaveChanges();
            // Now, that I have deleted allChilds I can add them again form outer source
            foreach (OuterDataChild c in Outerdata) {
                 Child child = new Child();
                 child.Id = Id; // from outer source
                 child.FatherId = father.FatherId;
                 father.Childs.Add(child);
            }
            mContext.SaveChanges();
        }
    }

正如您所看到的,我的解决方法是手动"删除父亲的所有Childs,将SaveChanges()删除到数据库。然后再将所有Childs表单外部源添加到集合和SaveChanges()。我不喜欢的是,本质上我必须注意正确的数据同步,这类似于实体框架的目的。我不喜欢删除部分。 我的解决方法是否有优雅的替代方案?

0 个答案:

没有答案