LinqToSQL 不更新数据库


// 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 是否已更改。提交更改((...SQL 事件探查器仅在执行"提交更改"行时显示"重置连接"。 有人知道为什么这不起作用吗? 谢谢!

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

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

搞笑,使用 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。

谢谢 - 你的评论会帮助我解决这个问题,我相信!我没有将"Id"列定义为主键,所以这显然不是启动器。 我本以为LinqToSQL会在更新失败时抛出错误。- S.

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

[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.

相关内容

  • 没有找到相关文章

最新更新