更新对象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();                    
                } 
            }
        }

当数据库中存在位置时,更新将无法正常工作。在HallHallPlan中创建重复: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);
        }

更新对象LinqToSql

LINQ to SQL有一个标识管理器;如果它在树中发现了一些无法识别的东西(即不在身份管理器中),则它认为它将被视为该项的插入。因此,因为它无法识别您的Hall实例,所以它正在插入它们。

有两种方法可以解决这个问题:

  • 与其直接将非L2S模型中的BasePlace, Hall, HallPlan0分配给L2S模型,您可以向匹配实例的数据上下文询问,即在循环中,使用ctx.Halls.FirstOrDefault(...)从数据上下文中获得等效的Hall,并添加而不是原始的
  • 使用Attach方法(即ctx.Halls.Attach(...))使L2S在启动前了解大厅实例