我有3个班:
BasePlace, Hall, HallPlan
。
关系:
BasePlace - Hall
:一对多。
Hall
- HallPlan
:一对多。
我从远程程序获得场所(场地)。我有以下方法来添加(或更新)对象:
public void AddPremieraPlace(IEnumerable<BasePlace> places)
{
if(places != null)
{
foreach (var place in places)
{
//is exist in db
var dbPlace = Database.BasePlaces.FirstOrDefault(p => p.OIDPremiera == place.OIDPremiera);
// if exist update properties and collections
if (dbPlace != null)
{
dbPlace.Name = place.Name
dbPlace.Halls = place.Halls;
}
else
Add(place); // just add new place
Database.SubmitChanges();
}
}
}
当数据库中存在地点时,更新工作不正常。在Hall
和HallPlan
创建副本:
Hall
表,例如:
OID Name PlaceId OIDPremiera
19 Redisson NULL 1
20 Test 2 NULL 3
21 Test 3 NULL 2
22 Redisson 5 1
23 Test 2 5 3
24 Test 3 5 2
如何正确更新? 感谢。
Add()
:
public virtual void Add(TClass entity)
{
Check.Argument.IsNotNull(entity, "entity");
Database.GetTable<TClass>().InsertOnSubmit(entity);
}
答案 0 :(得分:3)
LINQ-to-SQL有一个身份管理器;如果它在树中找到无法识别(即不在身份管理器中)的内容,则它假定将其视为该项的插入。因为它无法识别您的Hall
个实例,所以它正在插入它们。
有两种方法可以解决这个问题:
Halls
分配给L2S模型,您可以向数据上下文询问匹配实例,即在循环中使用{ {1}}从数据上下文中获取等效的ctx.Halls.FirstOrDefault(...)
,并添加 而不是原始Hall
方法(即Attach
)让L2S了解大厅实例