2009-10-06 73 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