我在將linq更新爲sql實體時遇到了一些麻煩。 出於某種原因,我可以更新我的item
實體的每個字段,除名稱。Linq to SQL - 未能更新
這裏有兩個簡單的測試中,我寫道:
[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 ([Weight] = @p5) AND ([Length] = @p6) AND ([AdministrativeCost] = @p7) -- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [1] -- @p1: Input Int (Size = 0; Prec = 0; Scale = 0) [1] -- @p2: Input VarChar (Size = 10; Prec = 0; Scale = 0) [My New MPN] -- @p3: Input Decimal (Size = 0; Prec = 5; Scale = 3) [30.000] -- @p4: Input Decimal (Size = 0; Prec = 5; Scale = 3) [10.000] -- @p5: Input Decimal (Size = 0; Prec = 5; Scale = 3) [40.000] -- @p6: Input Decimal (Size = 0; Prec = 5; Scale = 3) [30.000] -- @p7: Input Money (Size = 0; Prec = 19; Scale = 4) [350.0000] -- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.4926
由於你可以看到,沒有更新正在產生(SET是空的......) 我不知道爲什麼會發生這種情況。
而且已經預先...是的,表Item
有一個PK(Id)。 謝謝提前!
更新: 看來,錯誤是由覆蓋GetHashcode()引起的。 這是我目前實施:
return string.Format("{0}|{1}|{2}|{3}", Name, Id, UPC, AdministrativeCost).GetHashCode();
如果修改名稱和一個其他財產發生了什麼?它是更新兩者還是僅更新其他屬性?在生成的代碼中,還有名爲「PropertyChanged」事件的setter?我不認爲DataContext認爲它是一個改變,除非事件被解僱。 – 2010-06-10 17:58:20
如果我修改名稱和另一個屬性,則只更改其他屬性。 – 2010-06-10 18:05:58