问题似乎是当我使用下面的代码将从ListBox获得的位置值分配给正在创建/编辑的分区时,EF创建一个新位置,然后输入该位置ID,并将分区输入到DivisionLocation表中不必要地创建多个位置,如下所示。
using (FRLEntities context = new FRLEntities())
{
for (int i = 0; i < lstPicked.Items.Count; i++)
{
var lpn = cm.GetLocation(Convert.ToInt32(lstPicked.Items[i].Value));
Location cLocation = new Location { LocationId = Convert.ToInt32(lstPicked.Items[i].Value), LocationName = lstPicked.Items[i].Text, LocationParentName = lpn.LocationParentName };
//CurrentDivision.Location = new EntityCollection<Location>();
CurrentDivision.Location.Add(cLocation);
}
}
一些数据
Division
Divisionid DevisionName
1 1st Division
2 2st Division
Location
LocationId LocationName
1 HG
2 FG
3 IK
4 HG
5 FG
DivisionLocation
DivisionId LocationId
1 1
1 3
2 1
2 2
2 4
1 5
提前致谢
答案 0 :(得分:1)
这是常见的问题。您在代码中创建了Location实例,但未从EF上下文加载它。因此,位置intance与当前上下文无关,当您向上下文添加新的CurrentDivision时,所有相关的位置也将被视为新对象。
如果你想避免这种情况,你必须以某种方式说EF上下文哪些位置是新的,哪些是现有的。我正在使用这种方法:
context.ObjectStateManager.ChangeObjectState(lpn, EntityState.Unchagned);