今天,为了适应需求的改变,而给表TableA(化名)添加了一个字段ReplyTo
IF
NOT
EXISTS
(
SELECT
*
FROM
sys.Columns
WHERE
name
=
N
'
ReplyTo
'
AND
object_id
=
object_id
(N
'
[OPQ_TableA]
'
))
ALTER TABLE [ OPQ_TableA ] WITH CHECK ADD ReplyTo varchar ( 256 ) null
ALTER TABLE [ OPQ_TableA ] WITH CHECK ADD ReplyTo varchar ( 256 ) null
运行完这句后,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 '... ' ,...
SET ...
WHERE 0 = 1 ' ,N '... ' ,...
这下,就奇怪了,怎么更新条件回是 0 = 1 呢?这不是不更新任何记录吗?也许是DataContext的设置和数据库的结构不一致,造成LINQ不知道怎么生成SQL,就搞出一个可以造成异常的语句吧。
当我把ReplyTo属性的Nullable设置为True后,就正常运行了。
而,把ReplyTo属性的Nullable设置为错误的False之后,再把ReplyTo的值NULL改为空的字符串之后。Linq竟然可以生成正确的SQL,继续奇怪。但我不管了,:-)