2010-08-30 129 views
0

问题是,当我使用下面的代码将从ListBox获得的位置值分配给正在创建/编辑的分区时,EF创建一个新位置,然后输入该位置ID,并且分区进入因此DivisionLocation表格会不必要地创建多个位置,如下所示。实体框架1.0问题

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

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

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

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