我有一个包含一对多关系的两个表的数据库。 父亲(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()。我不喜欢的是,本质上我必须注意正确的数据同步,这类似于实体框架的目的。我不喜欢删除部分。 我的解决方法是否有优雅的替代方案?