2008-10-29 102 views
2
// 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!!! 
} 

在调试器,地址已经从数据库表中的所有电流值,我可以验证AddressLine1改变就在我打电话db.SubmitChanges()... SQL事件探查器只显示执行SubmitChanges行时会出现“重置连接”。任何人都知道为什么这不起作用?谢谢!LinqToSQL不更新数据库

回答

6

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

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

+0

我不知道该表需要一个主键。试图弄清楚为什么变化跟踪似乎没有奏效,我在墙上打了一会儿头。感谢这个答案! – 2009-08-07 03:07:56

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。

+0

db.GetTable

()与db.Address相同。后者只是一个调用db.GetTable <>的附加属性。 – liggett78 2008-10-29 22:30:50

1

谢谢 - 您的意见将帮助我解决这个问题,我确定!我没有将“Id”列定义为PrimaryKey,因此这是一个明显的非启动器。我希望LinqToSQL在更新失败时会引发错误。 - S.

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.

+0

所以答案是你需要定义一个主键。 :) – Bryant 2011-09-14 22:17:09