代码之家  ›  专栏  ›  技术社区  ›  Steve L

LinqToSQL不更新数据库

  •  2
  • Steve L  · 技术社区  · 17 年前
    // 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之前验证AddressLine1是否已更改。SubmitChanges()。。。执行SubmitChanges行时,SQL Profiler仅显示“重置连接”。有人知道为什么这不管用吗?谢谢

    4 回复  |  直到 17 年前
        1
  •  6
  •   Bryant    17 年前

    您可以使用 GetChangeSet 方法

    还要确保表中定义了一个主键,并且映射知道这个主键。否则您将无法执行更新。

        2
  •  1
  •   Sam    17 年前

    有趣的是,使用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。

        3
  •  1
  •   Steve L    17 年前

    谢谢——你的评论肯定会帮我解决这个问题!我没有将“Id”列定义为PrimaryKey,所以这显然是一个非启动项。我本以为LinqToSQL在更新失败时会抛出一个错误。-s

        4
  •  1
  •   Steve L    17 年前

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

    [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来识别它上面的说明符。两者都是必需的!一旦我做了更改,更改集就找到了我想要做的更新,并完成了,但在此之前,它告诉我需要更新0行,并拒绝提交更改。

    谢谢你的帮助s