更新对象LinqToSql
本文关键字:LinqToSql 对象 更新 | 更新日期: 2023-09-27 18:27:22
我有三个类:
CCD_ 1。
关系: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);
}
LINQ to SQL有一个标识管理器;如果它在树中发现了一些无法识别的东西(即不在身份管理器中),则它认为它将被视为该项的插入。因此,因为它无法识别您的Hall
实例,所以它正在插入它们。
有两种方法可以解决这个问题:
- 与其直接将非L2S模型中的
BasePlace, Hall, HallPlan
0分配给L2S模型,您可以向匹配实例的数据上下文询问,即在循环中,使用ctx.Halls.FirstOrDefault(...)
从数据上下文中获得等效的Hall
,并添加而不是原始的 - 使用
Attach
方法(即ctx.Halls.Attach(...)
)使L2S在启动前了解大厅实例