【问题标题】:How can I update in Linq an entity that is disconnected from database?如何在 Linq 中更新与数据库断开连接的实体?
【发布时间】:2010-09-07 14:11:23
【问题描述】:

下面的代码运行不正确并抛出InvalidOperationExcepiton

public void Foo()
{
 DataContext context = new DataContext();
 LinqEntity item = new LinqEntity(){ Id = 1, Name = "John", Surname = "Doe"} ;
 context.LinqEntities.Attach(item, true);
}

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    默认情况下,实体在进行编辑时将使用所有字段来检查并发性。这就是引发 InvalidOperationException 的原因。

    这可以将所有字段的更新检查属性设置为从不。必须在所有字段上执行此操作才能附加修改后的实体。如果这样做了,对 context.SubmitChanges() 的额外调用将​​保存数据。

    或者,如果您知道原始值,您可以附加然后进行更新,但所有正在检查的值都必须与原始值匹配。

    LinqEntity item = new LinqEntity(){ Id = 1, Name = "OldName", Surname = "OldSurname"}; 
    context.LinqEntities.Attach(item);
    item.Name = "John";
    item.Surname = "Doe";
    context.SubmitChanges();
    

    【讨论】:

      【解决方案2】:

      我不确定您所说的与数据库断开连接是什么意思。

      您似乎正试图在 LinqEntities 表中插入一个新行 -- 对吗?

      如果是这样,你会想要这样做

      context.LinqEntities.InsertOnSubmit(item);
      context.Submit();
      

      【讨论】:

        【解决方案3】:

        好的,如果您尝试更新 ID = 1 的行,您可以这样做:

        DataContext context = new DataContext();
        LinqEntity item = (from le in context.LinqEntities
                          where le.ID == 1
                          select le).Single();
        item.Name = "John";
        item.Surname = "Doe";
        
        context.Submit();
        

        您还可以将 Linq 表达式替换为更简洁的 lambda:

        LinqEntity item = context.LinqEntities.Single(le => le.ID == 1);
        

        DataContext 所做的最重要的事情是跟踪您所做的任何更改,因此当您调用 Submit 方法时,它会为您更改的内容自动生成 Insert 语句。

        【讨论】:

          【解决方案4】:

          使用 ORM 时,您通常会在更新对象之前选择它。

          如果您不想进行选择,可以使用DataContext.ExecuteCommand(...) 绕过 ORM。

          【讨论】:

          • 我不同意这种行为是典型的说法。当然,任何实现 ActiveRecord 模式的 ORM 都不是这种情况。在很多人看来,这是 Linq To SQL 的一个局限。这里有一些很好的讨论:west-wind.com/Weblog/posts/135659.aspx
          • Linq-to-sql 没有实现 Active Record。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-05-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多