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