c# - 更新对象 LinqToSql

标签 c# linq-to-sql

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

            }
        }

当数据库中存在位置时,更新将无法正常进行。在 HallHallPlan 中创建重复项: 大厅表,例如:

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/

相关文章:

c# - 循环 System.Data.Objects.DataClasses.EntityCollection

c# - 静态类的竞争条件?

c# - 我应该如何使用 IoC/依赖注入(inject)来处理我的实体/域对象?

c# - Linq-To-SQL 中的 Hacker News 风格排序算法

c# - 为什么 LINQ 查询返回的结果/行数多于我正在查询的表?

c# - 以编程方式重置 Windows XP 空闲时间

c# - 在 asp.net 中将数据表日期转换为 dd/mm/yyyy 格式

c# - 将 URI 映射到 LINQ-to-SQL 中的字符串字段

.net - 我什么时候应该使用 Compiled LINQ vs Normal LINQ

c# - 命名空间 'System.Web'中不存在HttpBrowserCapabilitiesBase