我有 3 节课:
BasePlace、大厅、HallPlan
。
关系:
BasePlace - Hall
:一对多。
Hall
- HallPlan
:一对多。
我从远程程序获取地点( field )。我有以下方法来添加(或更新)对象:
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
中创建重复项:
大厅
表,例如:
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
如何正确更新? 谢谢。
添加()
:
public virtual void Add(TClass entity)
{
Check.Argument.IsNotNull(entity, "entity");
Database.GetTable<TClass>().InsertOnSubmit(entity);
}
最佳答案
LINQ-to-SQL 有一个身份管理器;如果它在树中发现了它无法识别的内容(即不在身份管理器中),那么它会假设它被视为该项目的插入。因为它无法识别您的 Hall
实例,它正在插入它们。
有两种方法可以解决这个问题:
- 而不是直接分配
Halls
从非 L2S 模型到 L2S 模型,您可以询问匹配实例的数据上下文,即在循环中使用ctx.Halls.FirstOrDefault(...)
得到等价的Hall
从数据上下文中添加那个而不是原来的 - 使用
Attach
方法(即ctx.Halls.Attach(...)
)让 L2S 在开始之前了解大厅实例
关于c# - 更新对象 LinqToSql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9662663/