簡體   English   中英

Linq-to-Sql SubmitChanges沒有更新字段......為什么?

[英]Linq-to-Sql SubmitChanges not updating fields … why?

我昨天晚上發布了這個問題 ,這讓我發現了一個很大的問題!

我的數據庫中有一個名為Units的十進制列,只要我將列的值設置為NON ZERO,並使用新值SubmitChanges列更新。 如果我嘗試將列的值設置為ZERO,則SubmitChanges不會更新列。

data.Units = this.ReadProperty<decimal>(UnitsProperty);
data.UnitPrice = this.ReadProperty<decimal>(UnitPriceProperty);
data.Price = this.ReadProperty<decimal>(PriceProperty);

我查看了DataContext日志,我可以看到查詢中不包含具有ZERO值的字段。 即使我試圖對代碼進行硬編碼,Linq也會忽略它。

data.Units = 0;
data.UnitPrice = 0;
data.Price = 0;

不用說這是殺了我! 任何想法為什么會這樣?

我在SO社區的幫助下想出了我的問題。 我的問題是由於我創建我的實體附加時的事實,列的默認值設置為零,所以當它試圖將值分配給零時... LinqToSql說嘿......沒有改變,所以我沒有更新價值。

我現在在做什么......只是為了讓它發揮作用如下:

ctx.DataContext.InvoiceItems.Attach(data, true);

這似乎迫使所有值將自己寫入數據庫。 這適用於現在。

我試圖用下面的代碼重現這個,但對我來說它是有效的。

using (DataClasses1DataContext ctx = new DataClasses1DataContext())
{
    var obj = ctx.DecimalColumnTables.First();
    Debug.Assert(obj.B != 0);
    obj.B = 0;
    ctx.SubmitChanges();
}

所以我認為你的領域必須有一些特殊的東西導致這一點。 我建議你用你的域模型創建一個這樣簡單的repro,看看會發生什么。

LINQ to SQL忽略對當前值的更新,因此如果該字段已經為零,則可能看不到任何更新。

關:您使用的OR / M是LINQ to SQL LINQ是.NET中查詢功能的名稱,但LINQ不定義也不實現任何更新邏輯。 所以問題與LINQ to SQL有關,而不是LINQ。

明顯的問題,但你確定列是在dbml / mapping文件中映射的嗎?

另外 - 它是一個計算列? (即價格=>單位* unitprice)

我在SO社區的幫助下想出了我的問題。 我的問題是由於我創建我的實體附加時的事實,列的默認值設置為零,所以當它試圖將值分配給零時... LinqToSql說嘿......沒有改變,所以我沒有更新價值。

我現在在做什么......只是為了讓它發揮作用如下:

ctx.DataContext.InvoiceItems.Attach(data, true);

這似乎迫使所有值將自己寫入數據庫。 這適用於現在。

更多信息......我想出了我的問題...更多的是對LinqToSql缺乏了解...我在做什么:

private void Child_Update(Invoice parent)
{
      using (var ctx = Csla.Data.ContextManager
           .GetManager(Database.ApplicationConnection, false))
      {
           var data = new Gimli.Data.InvoiceItem()
           {
                InvoiceItemId = ReadProperty(InvoiceItemIdProperty)
           };

           ctx.DataContext.InvoiceItems.Attach(data);

           if (this.IsSelfDirty)
           {
                // Update properties
           }
     }
}

我認為這會加載原始值...會發生的是它創建一個具有默認值的新對象...空值,如小數為0,uniqueidentifiers為Guid.Empty等等。

因此,當它更新屬性時,它會將Units視為0,並將其設置為零。 好吧LinqToSql不會將此識別為更改,因此它不會更新該字段。 所以我必須做的是以下內容:

ctx.DataContext.InvoiceItems.Attach(data, true);

現在,無論是否真的發生了更改,都會在update語句中生成所有修改。 這工作......似乎有點hackish!

正確的答案是許多人指出使用Attach的特殊重載,它接受一個布爾參數來將其視為已修改,(使用另一個重載的錯誤,它根本不起作用):

ctx.DataContext.InvoiceItems.Attach(data, true);

但請注意,您仍可能需要在“timestamp”類型的表中包含“Version”列。

我有這個問題,我看到的所有建議都沒有適用或工作。

但我發現我犯了一個非常簡單的錯誤!

更新屬性時,我實際上調用了一個自定義Set方法(因為還有其他一些東西需要更改以響應相關的主要屬性)。

經過數小時的頭部刮擦,我注意到我的Set方法正在更新私有成員而不是公共屬性,即this._Walking = value;

我所要做的就是將其改為this.Walking = value; 一切都開始奏效了!

暫無
暫無

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

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