簡體   English   中英

Linq to SQL - 無法更新

[英]Linq to SQL - Failing to update

我在將linq更新為sql實體時遇到了一些麻煩。 出於某種原因,除了名稱 ,我還可以更新item實體的每個字段。

以下是我寫的兩個簡單測試:

 [TestMethod]
        public void TestUpdateName( ) {
            using ( var context = new SimoneDataContext( ) ) {
                Item item = context.Items.First( );

                if ( item != null ) {
                    item.Name = "My New Name";
                    context.SubmitChanges( );
                }
            }
        }

        [TestMethod]
        public void TestUpdateMPN( ) {
            using ( var context = new SimoneDataContext( ) ) {
                Item item = context.Items.First( );

                if ( item != null ) {
                    item.MPN = "My New MPN";
                    context.SubmitChanges( );
                }
            }
        }

不幸的是,TestUpdateName()失敗並出現以下錯誤: System.Data.SqlClient.SqlException: Incorrect syntax near the keyword 'WHERE'..

這是輸出的SQL:

UPDATE [dbo]。[Items] SET WHERE([Id] = @ p0)AND([CategoryId] = @ p1)AND([MPN] = @ p2)AND([Height] = @ p3)AND([Width] = @ p4)AND([權重] = @ p5)AND([長度] = @ p6)AND([AdministrativeCost] = @ p7) - @ p0:輸入Int(大小= 0; Prec = 0; Scale = 0 )[1] - @ p1:輸入Int(大小= 0; Prec = 0; Scale = 0)[1] - @ p2:輸入VarChar(大小= 10; Prec = 0; Scale = 0)[我的新增功能] MPN] - @ p3:輸入十進制(大小= 0; Prec = 5;標度= 3)[30.000] - @ p4:輸入十進制(大小= 0; Prec = 5;標度= 3)[10.000] - @ p5:輸入十進制(大小= 0; Prec = 5; Scale = 3)[40.000] - @ p6:輸入十進制(大小= 0; Prec = 5; Scale = 3)[30.000] - @ p7:輸入Money(Size = 0; Prec = 19; Scale = 4)[350.0000] - 上下文:SqlProvider(Sql2008)模型:AttributedMetaModel Build:3.5.30729.4926

正如您所看到的,沒有生成更新(SET為空...)我不知道為什么會發生這種情況。

並且已提前...是,表Item有PK(Id)。 提前謝謝

更新:似乎錯誤是由重寫GetHashcode()引起的。 這是我目前的實施:

return string.Format( "{0}|{1}|{2}|{3}", Name, Id, UPC, AdministrativeCost).GetHashCode( );

聽起來你的DBML可能不同步。 您應該刪除表並重新添加它們並嘗試再次運行它。

只需手動刪除Items表並重新添加即可。

編輯 :根據您的編輯,您應該查看以下關於GetHashCode線程。

http://social.msdn.microsoft.com/forums/en-US/linqtosql/thread/6cc6c226-f718-4b22-baad-dba709afe74b/

.Net規則聲稱GetHashCode()和Equals()必須始終串聯實現。 兩個相等的對象必須具有相同的哈希碼。

此外,GetHashCode()+ Equals()的組合形成了實體的身份概念。 如果您基於字段值(PK除外)創建它,則更改字段時標識會更改。 如果L2S必須根據實體的身份在字典中查找其他信息,這是不好的,特別是如果L2S需要在其身份緩存中查找實體!

建議:不要更改實體的身份。 L2S期望它基於對象的自然(基於地址)身份。

看來生成的SQL不包括SET子句的內容(注意SET之后沒有[Name] = @pXX )。 是否在dbml設計器中正確設置了實體字段的所有屬性(數據類型,大小等)?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM