2016-02-04 35 views
0

我有一個Breeze上下文提供程序與EF 6.1.1,數據庫優先的應用程序與SQL Server交流,我遇到了一些問題。我可以插入新記錄,但是當我更新它時,並不是所有更改的列都寫入數據庫。Breeze-> EF6更新一些更改的列,但不是全部

我有一個生成的POCO,看起來像這樣:

public partial class Inventory 
{ 
    public Inventory() 
    { 
    } 

    public int Id { get; set; } 
    public System.DateTime EnteredAt { get; set; } 
    public string EnteredBy { get; set; } 
    public string UpdatedBy { get; set; } 
    public Nullable<System.DateTime> UpdatedAt { get; set; } 
    public string Comment { get; set; } 
} 

當我去和更新客戶端(設置Comment屬性)的實體,然後郵寄到微風,我做的一些非常簡單的套EFContextProvider :: BeforeSaveEntity覆蓋:

protected override Dictionary<Type, List<EntityInfo>> BeforeSaveEntities(Dictionary<Type, List<EntityInfo>> saveMap) 
    { 
     // only one inventory is ever sent in 
     if (saveMap.ContainsKey(typeof(Inventory))) 
     { 
      var source = saveMap[typeof(Inventory)].First().Entity as Inventory; 

      // set up the user and time fields 
      if (source.Id <= 0) 
      { 
       source.EnteredBy = _defaultUserName; 
       source.EnteredAt = DateTime.Now; 
      } 
      else 
      { 
       source.UpdatedBy = _defaultUserName; 
       source.UpdatedAt = DateTime.Now; 
      } 

     } 
    } 

但是,當改變被提交時,改變UpdatedBy值永遠不會到數據庫。

我打開EF6 SQL日誌記錄,果然,UPDATE語句完全錯過了屬性。

UPDATE [dbo].[Inventory] 
SET [Comment] = @0, [UpdatedAt] = @1 
WHERE ([Id] = @2) 
-- @0: '1532' (Type = AnsiString, Size = 250) 
-- @1: '2/4/2016 10:32:58 PM' (Type = DateTime2) 
-- @2: '100344' (Type = Int32) 
-- Executing at 2/4/2016 3:33:06 PM -07:00 
-- Completed in 7 ms with result: 1 

當然,此更新的數據庫中的UpdatedBy爲NULL。

我不明白爲什麼這個特定的列不會做什麼,當一個'相鄰'列,同時設置,做。我也不知道這是Breeze問題還是EF問題,因爲我可以回去使用EF,DBContext都可以正常工作。

我也嘗試從EDMX文件中刪除表並重新添加它無濟於事。我重新驗證了該列在EDMX文件的表格中。

作爲一個黑客,我要做的就是回去重新讀取已更改的記錄,然後將其更新並重新發送。

任何意見,將不勝感激。

+0

您可以只更新「UpdateBy」列(註釋其他列)並告訴我們您的實體的當前狀態以及當您嘗試保存時發生了什麼? 「var state = ctx.Entry(source).State;」 –

回答

1

您可以將BeforeSaveEntity方法和客戶端實體的示例操作發佈到您的問題中嗎?

其次,確保你更新的實體信息的屬性映射在BeforeSave方法,像這樣:

source.UpdatedBy = "Joe User"; 
source.UpdatedAt = DateTime.Now; 
source.Comment = "1532"; 

entityInfo.OriginalValuesMap["UpdatedBy"] = null; 
entityInfo.OriginalValuesMap["UpdatedAt"] = null; 
entityInfo.OriginalValuesMap["Comment"] = null; 

如果「UpdatedAt」屬性是在調用的SaveChanges之前在客戶機上操作我不知道,因此該屬性已經在屬性映射中標識爲「修改」。

+0

設置OriginalValuesMap工作!謝謝。 – cardinalPilot

+0

太棒了!你能把這個標記爲正確答案嗎? – Jonathan

相關問題