2009-10-06 76 views
1

我运行下面的代码:不一致的LinqToSql更新

if(ven.Source == null)ven.Source = new Source(); 
        ven.name = (string) venue.Element("venueName"); 
        Console.WriteLine("Venue Name: " + ven.name); 
        ven.Source.companyId = 1; 
        ven.Source.sourceReference = (string)venue.Attribute("venueID"); 

我通过相同的XML文件,每次运行,每次(string)venue.Attribute("venueID");是exacly一样的,所以为什么数据库更新获得运行保存更改?为什么公司ID没有设置,但源参考呢? :

exec sp_executesql N'UPDATE [dbo].[Source] 
SET [sourceReference] = @p3 
WHERE ([sourceId] = @p0) AND ([companyId] = @p1) AND ([sourceReference] = @p2)',N'@p0 int,@p1 int,@p2 nchar(12),@p3 nchar(12)',@p0=71,@p1=1,@p2=N'x1830wa  ',@p3=N'x1830wa  ' 

回答

1

的一点想法:

  • 有它实际上改变价值 - 这是很懒散的,只有坚持感知的变化;拨打set是不够的
  • 它是主键/身份的一部分吗? (WHERE让我觉得没有,虽然)
  • 它在dbml中吗?还是你手动添加它,忘记了?
+0

谢谢,它不是主要/身份的一部分,在dbml中。你首先指出我并不真正了解,但是让我看看并假设一个答案。字符串venueID只是'x1830wa',而字段是NCHAR(12),因此比较字符串'x1830wa'和'x1830wa'并不是绝对匹配,因此它认为已经做出了更改。这可能是原因吗? – Richbits 2009-10-06 16:08:46

+0

是的;当你将它加载到数据库之外(作为'[n] char(12)'),它通常会包含填充(与[[n] varchar(12)'对比) - 所以如果你随后将键更新为*没有*空白它将被视为不同。任何*不*似乎有变化的属性都不会出现在'UPDATE'中。 – 2009-10-06 19:06:26