LinqToSQL不更新数据库

时间:2008-10-29 21:49:25

标签: sql linq linq-to-sql

// 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时仅显示“重置连接”行执行。任何人都知道为什么这不起作用?谢谢!

4 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

谢谢 - 您的评论将帮助我解决这个问题我确定!我没有将“Id”列定义为PrimaryKey,因此这显然是非首发。我原以为LinqToSQL会在更新失败时抛出错误。 - S.

答案 3 :(得分:1)

好的,这是结果。我不能使用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.