实体框架1.0问题

时间:2010-08-30 08:05:35

标签: c# .net frameworks entity

问题似乎是当我使用下面的代码将从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

提前致谢

1 个答案:

答案 0 :(得分:1)

这是常见的问题。您在代码中创建了Location实例,但未从EF上下文加载它。因此,位置intance与当前上下文无关,当您向上下文添加新的CurrentDivision时,所有相关的位置也将被视为新对象。

如果你想避免这种情况,你必须以某种方式说EF上下文哪些位置是新的,哪些是现有的。我正在使用这种方法:

context.ObjectStateManager.ChangeObjectState(lpn, EntityState.Unchagned);