【发布时间】:2014-12-15 12:46:56
【问题描述】:
我正在使用 GraphDiff,以及最新版本的实体框架,遵循代码优先的方法。
我正在尝试以这种方式更新 Food 实体:
public void Update(Food food)
{
using (var db = new DatabaseMappingContext())
{
food = db.UpdateGraph(food, map => map.OwnedEntity(f => f.FoodRecipe, withRecipe => withRecipe.
OwnedCollection(r => r.RecipeSteps, withRecipeStep => withRecipeStep.
OwnedCollection(rs => rs.StartObjectSlots, withStartObjectSlots => withStartObjectSlots.
AssociatedEntity(sos => sos.BelongingRecipeStepAsStart)
).
OwnedCollection(rs => rs.EndObjectSlots, withEndObjectSlots => withEndObjectSlots.
AssociatedEntity(eos => eos.BelongingRecipeStepAsEnd)
).
AssociatedEntity(rs => rs.ActionOfUser)
).
AssociatedCollection(r => r.InteractiveObjects)
).
AssociatedCollection(f => f.FoodVarieties));
//....
db.SaveChanges();
}
}
StartObjectSlots 和 EndObjectSlots 是 2 个包含其他一些不相关数据的列表。
InteractiveObjects 包含 InteractiveObject 类型的对象,这是可以放置在那里的许多对象类型的基本类型。其中一种派生类型(假设IntObjDerived 具有一对多属性)。
现在,我正在尝试以这种方式更新以下实体:
ServerAdapter sa = new ServerAdapter();
//Loading a food from DB.
Food food = sa.LoadAllFoods().First();
RecipeStep rs = new RecipeStep();
rs.Name = "This is a test recipe step";
//Adding a User Action from the database.
rs.ActionOfUser = sa.LoadAllUserActions().First();
//....
//Add the step in the recipe
food.FoodRecipe.RecipeSteps.Add(rs);
//Update the food.
sa.Update(food);
现在,当代码被执行时,一个新的空 ActionOfUser 实体被插入到数据库中。此外,为上述实体的一对多导航属性中的每一个插入一个新的空实体在数据库中插入三个新配方,一个是空数据,一个是半满的,这个一个应该得救的。这两种情况都是不需要的,我正在努力寻找解决方案。我尝试了一些更改,但我一直坚持这一点。有什么建议么?
(我知道这似乎是 2 个问题,但我想把它作为一个问题,因为它可能是数据库中相关的相同问题)。
编辑:我下载并编译了GraphDiff 以检查发生了什么,我注意到创建了一些除了实体 ID 值之外为空的对象。
我猜这些副作用是因为实际上我添加一个新节点到对象图(一个新的RecipeStep),我不确定graphdiff是否完全支持这一点。
更新(tl; dr 版本):我尝试使用 Entity Framework 的 GraphDiff 对图形深度大于 2 的对象应用 UpdateGraph 调用。
根据我的尝试,似乎 GraphDiff 在深度大于 2 的图中应用了双重插入,这需要很长时间,特别是如果添加了一个带有从数据库加载的子节点的新节点。我是否应该采用不同的方法,例如将 UpdateGraph 调用拆分为多个调用?
提前谢谢你!
【问题讨论】:
-
当然你需要解释一下你的问题。非常难读。你能把问题简化吗?
-
添加了问题的简化版本。
-
你能复制你当前的模型吗?
-
恐怕这是不可能的。我在此发布了一个答案。
标签: c# entity-framework ef-code-first graphdiff