使用Linq to Sql,不会更新,但不会抛出异常

时间:2010-03-22 15:56:10

标签: c# .net linq-to-sql

运行.net 2008,asp.net,Linq to sql,sql server 2008 express

Foo f = db.Foo.First(x => x.ID == id);
f.IsValid = true;
db.SubmitChanges();

我有一个非常基本的表,它有几个字段,没有FK约束。当我调用.SubmitChanges()时,没有数据保存,但没有抛出任何错误。有什么想法吗?

不使用任何显式事务范围,不自动生成字段,服务器上也没有触发器。

4 个答案:

答案 0 :(得分:4)

抛开Tyop,首先要设置db.Log = Console.Out;以查看是否存在任何TSQL(或更好:运行SQL跟踪)。如果没有任何内容发送,那么IsValid 已经为真 - 除非必须(unless you force it),否则不会重新保存此类更改

不太可能,您可能会意外关闭对象跟踪(db.ObjectTrackingEnabled)。

其他常见错误包括:

  • 使用Complete()时未调用TransactionScope(如果 使用TransactionScope
  • 使用数据库文件(而不是单独的服务器),检入原始文件(在解决方案中)而不是在构建输出中(通常是/ bin / debug或/ bin / release)。

我也假设 IsValid实际上是db-mapping属性(它们不一定是)

答案 1 :(得分:2)

您需要在IsValid上设置f,而不是x

Foo f = db.Foo.First(x => x.ID == id); 
f.IsValid = true; 
db.SubmitChanges(); 

如果您使用Complete,请务必致电TransactionScope

答案 2 :(得分:2)

IsValid是否在设计器中标记为AutoGenerated字段?如果是这样,您所做的任何更改都不会传播回服务器。此外,您是否有可能在更新时运行的数据库触发器,而不是插入,即将其设置为默认值0(false)?

答案 3 :(得分:1)

事实证明,自从我上次使用此应用程序以来,主键已从数据库中删除。当我最近重新生成.dbml时,它生成时没有主键。重新添加它已解决了这个问题。