今天,为了适应需求的改变,而给表TableA(化名)添加了一个字段ReplyTo

IF NOT EXISTSSELECT * FROM sys.Columns WHERE name =N'ReplyTo' AND object_id=object_id(N'[OPQ_TableA]'))
ALTER TABLE [OPQ_TableA]  WITH CHECK ADD ReplyTo varchar(256null

 

运行完这句后,OPQ_TableA就添加了一个字段ReplyTo,并且值都是NULL。
然后,给LinqToSQL类文件OPQ.dbml中的表OPQ_TableA,手工添加属性ReplyTo:
Name ReplyTo
Server Data Type VarChar(256)
Source ReplyTo
忘了给它的属性Nullable设置为True了。在其它设计做完后。手工测试更新数据时,报错错,很奇怪的错误信息:
 System.Data.Linq.ChangeConflictException: Row not found or changed. at System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode)
用LINQ To SQL碰到奇怪的错误信息是不奇怪了。
用SQL Server Profiler跟踪一下SQL的执行情况。发现Update语句竟然是
exec sp_executesql N'UPDATE [dbo].[OPQ_TableA]
SET ...
WHERE 0 = 1
',N'...',...
这下,就奇怪了,怎么更新条件回是 0 = 1 呢?这不是不更新任何记录吗?也许是DataContext的设置和数据库的结构不一致,造成LINQ不知道怎么生成SQL,就搞出一个可以造成异常的语句吧。
当我把ReplyTo属性的Nullable设置为True后,就正常运行了。
而,把ReplyTo属性的Nullable设置为错误的False之后,再把ReplyTo的值NULL改为空的字符串之后。Linq竟然可以生成正确的SQL,继续奇怪。但我不管了,:-)
posted on 2008-12-19 15:08  asterzhao  阅读(692)  评论(0编辑  收藏  举报