Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更新对象LinqToSql_C#_Linq To Sql - Fatal编程技术网

C# 更新对象LinqToSql

C# 更新对象LinqToSql,c#,linq-to-sql,C#,Linq To Sql,我有三门课: 基地、大厅、大厅平面图 关系: 基地大厅:一对多。 大厅-大厅平面图:一对多 我从远程程序获得位置(场地)。我使用以下方法添加(或更新)对象: 如何正确更新? 谢谢 Add(): 公共虚拟空添加(TClass实体) { Check.Argument.IsNotNull(实体,“实体”); Database.GetTable().InsertOnSubmit(实体); } LINQ to SQL有一个身份管理器;如果它在树中发现它无法识别的内容(即不在identity manager

我有三门课:
基地、大厅、大厅平面图

关系:
基地大厅
:一对多。
大厅
-
大厅平面图
:一对多

我从远程程序获得位置(场地)。我使用以下方法添加(或更新)对象:

如何正确更新? 谢谢

Add()

公共虚拟空添加(TClass实体)
{
Check.Argument.IsNotNull(实体,“实体”);
Database.GetTable().InsertOnSubmit(实体);
}

LINQ to SQL有一个身份管理器;如果它在树中发现它无法识别的内容(即不在identity manager中),则它会假定该内容将被视为该项目的插入内容。因此,因为它无法识别您的
霍尔
实例,所以它正在插入它们

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

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

  • PlaceId
    列是
    BasePlace
    表的外键吗?重复的行是那些在
    22
    24
    之间有
    OID
    的行吗?你的add()是做什么的。@Enricoampidoglio:是的,它是FK。是的,在22-24之间复制。@Pleun:我更新了qiestion。在本例中添加方法not call。在本例中,
    place.Halls
    来自何处?这是否来自相同的数据上下文?我添加了以下内容:
    Database.BasePlaces.Attach(place)。没有错误,但在数据库中没有更改。@user348173它不是您要附加的位置;这是大厅,不是吗?我要
    Place
    和所有收藏:
    Place.Halls
    Hall
    有集合
    HallPlans
    @user348173是,但每个Hall都是一个对象。。。听起来您想使用数据上下文中的现有对象…?是的,并更改其属性。
    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();                    
                    } 
    
                }
            }
    
    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);
            }