【问题标题】:LinqToSQL Not Updating the DatabaseLinqToSQL 不更新数据库
【发布时间】:2008-10-29 21:49:24
【问题描述】:
// goal: update Address record identified by "id", with new data in "colVal"

string cstr = ConnectionApi.GetSqlConnectionString("SwDb"); // get connection str
using (DataContext db = new DataContext(cstr)) {
    Address addr = (from a in db.GetTable<Address>()
                    where a.Id == id
                    select a).Single<Address>();
    addr.AddressLine1 = colValue.Trim();
    db.SubmitChanges(); // this seems to have no effect!!!
}

在调试器中,addr 具有 db 表中的所有当前值,并且我可以在调用 db.SubmitChanges() 之前验证 AddressLine1 是否已更改... SQL Profiler 在 SubmitChanges 时仅显示“重置连接”行执行。有人知道为什么这不起作用吗?谢谢!

【问题讨论】:

    标签: sql linq linq-to-sql


    【解决方案1】:

    您可以使用GetChangeSet 方法快速查看要提交的更改。

    还要确保您的表定义了主键并且映射知道该主键。否则您将无法执行更新。

    【讨论】:

    • 我不知道该表需要一个主键。我用头撞墙了好一阵子,试图弄清楚为什么更改跟踪似乎不起作用。感谢您的回答!
    【解决方案2】:

    有趣的是,使用 GetTable 和 Single。我本来希望代码看起来像这样:

    string cstr = ConnectionApi.GetSqlConnectionString("SwDb"); // get connection str
    using (DataContext db = new DataContext(cstr)) 
    {    
      Address addr = (from a in db.Address where a.Id == id select a).Single();    
      addr.AddressLine1 = colValue.Trim();    
      db.SubmitChanges(); // this seems to have no effect!!!
    }
    

    我不知道 GetTable 会对你做什么。

    另一件事,调试Linq2SQL尝试添加

    db.Log = Console.Out;
    

    在 SubmitChanges() 之前,这将显示执行的 SQL。

    【讨论】:

    • db.GetTable
      () 与 db.Address 相同。后者只是调用 db.GetTable.
      的附加属性
    【解决方案3】:

    谢谢——我相信你们的 cmets 会帮我解决这个问题!我没有将“Id”列定义为 PrimaryKey,所以这显然不是首发。我原以为更新失败时 LinqToSQL 会抛出错误。 -- S.

    【讨论】:

      【解决方案4】:

      好的,结果如下。我不能使用 db.Address 表单,因为我没有使用设计器来创建我的数据库对象,而是将它们定义为如下类:

      [Table(Name = "Addresses")]
      public class Address
      {
          [Column(Name = "Id",IsPrimaryKey=true)]
           public int Id { get; set; }
          [Column(Name = "AddressLine1")]
          public string AddressLine1 { get; set; }
              ...
      

      最初,我没有在数据库中将“Id”列设置为 PK,也没有在上面的 [Column...] 说明符中使用 IsPrimaryKey=true 对其进行标识。两者都是必需的!一旦我进行了更改,ChangeSet 就找到了我想做的更新,并做了,但在此之前它告诉我需要更新 0 行并拒绝提交更改。

      感谢您的帮助! -- S.

      【讨论】:

      • 所以答案是您需要定义一个主键。 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-29
      • 1970-01-01
      相关资源
      最近更新 更多