更新对象Linq To Sql

时间:2012-03-12 06:33:35

标签: c# linq-to-sql

我有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();                    
                } 

            }
        }

当数据库中存在地点时,更新工作不正常。在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);
        }

1 个答案:

答案 0 :(得分:3)

LINQ-to-SQL有一个身份管理器;如果它在树中找到无法识别(即不在身份管理器中)的内容,则它假定将其视为该项的插入。因为它无法识别您的Hall个实例,所以它正在插入它们。

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

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