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