2010-05-28 38 views
6

我使用EF 4,使用sprocs爲我的實體映射所有CUD操作。Entity Framework 4 EntityState未更改的實體更新

我有兩個表,ADDRESS和PERSON。一個人可以有多個與他們相關的地址。

這裏是我運行代碼:

Person person = (from p in context.People 
          where p.PersonUID == 1 
          select p).FirstOrDefault(); 

Address address = (from a in context.Addresses 
           where a.AddressUID == 51 
           select a).FirstOrDefault(); 

address.AddressLn2 = "Test"; 

context.SaveChanges(); 

更新與我retrieveing的人相關的地址 - 儘管他們沒有在代碼中的任何方式明確地聯繫在一起。當context.SaveChanges()執行時,不僅我的Address實體的Update sproc被激發(就像您所期望的那樣),但Person實體的Update sproc也是如此 - 即使您可以看到沒有對該實體做出任何更改人員實體。

當我在context.SaveChanges()調用之前檢查兩個對象的EntityState時,我發現我的Address實體具有「Modified」的EntityState,而我的Person enity具有「Unchanged」的EntityState。

爲什麼更新sproc被調用Person實體?有沒有可以設置的某種設置來防止這種情況發生?


我創建了一個第二個項目,以確保該問題是不是因爲在我的當前項目環境出事。

首先,我創建了一個包含Order和OrderDetail表的新數據庫。他們之間有一個外鍵,以便Order可以有多個與它關聯的OrderDetail。我還在Order和OrderDetail表上創建了「更新後」數據庫觸發器,用於更新記錄時更新DateTime字段。

其次,我創建了一個簡單的WPF應用程序,並創建了從我的數據庫生成的ADO.NET實體模型。

第三,我添加代碼到我的類的構造函數如下:

public partial class MainWindow : Window 
    { 
    public MainWindow() 
    { 
     InitializeComponent(); 

     MyEntities context = new MyEntities(); 

     Order order = (from o in context.Orders 
       select o).FirstOrDefault(); 

     OrderDetail orderDetail = (from d in order.OrderDetails 
        select d).FirstOrDefault(); 

     orderDetail.Qty = 7; 

     context.SaveChanges(); 
    } 
    } 

我跑的程序沒有做任何函數映射我的訂單和的OrderDetail對象。結果正是我期望看到的,OrderDetail記錄更新爲7,UpdateDateTime字段填充更新發生的日期和時間。沒有更改我的訂單記錄,這意味着沒有更新發生。

然後我創建存儲過程來處理DB中Order和OrderDetail表的更新。他們沒有做任何特別的事情,只是接受表中每一列的參數,然後設置每個字段等於相關的參數。然後,我使用Mapping Details(Map Entity to Functions)窗口將這些存儲過程映射到我的Model對象。

做完映射後,我運行了程序。因此,我觀察到看到更新OrderDetail表的預期行爲,但此外Order表「更新後」觸發器已被觸發,並且UdateDateTime字段被設置爲更新發生的日期和時間 - 我不希望這樣做。

有誰知道一種方法來利用所有插入,更新和刪除操作的存儲過程,並沒有更新級聯到相關的實體?

+0

只是爲了確保沒有其他代碼與您的錯誤相關聯? – Nix 2010-05-28 18:46:44

+0

我沒有看到錯誤。我只是沒有看到我期望的行爲,我想知道爲什麼和我需要做什麼才能看到預期的行爲,即只有Address實體在數據庫中得到更新。 唯一的其他代碼將是我的上下文對象的實例化,它只是創建一個EF生成的實體上下文的新實例。 – Filosopher 2010-05-28 18:56:30

+0

更新:正如我在我原來的發佈中所說的,我使用存儲過程來處理所有我的表上的創建,更新和刪除。我只是從我的Model中刪除這些映射,然後在Person表上使用DB觸發器再次運行代碼,並且沒有發生更新。看起來像是創建,更新和刪除的sproc映射,導致更新發生在這種情況下。不幸的是,我們不得不爲這些操作使用sprocs,因此仍然需要解決方案。我只是想我會用更多的信息更新這篇文章。 – Filosopher 2010-05-28 20:11:34

回答

4

我有這個相同的問題,並已通過在that MS KBD page上提到的修補程序解決。

該修復程序僅在.NET 4.5中廣泛發佈。不過,我期望EF 6(它可以在.NET 4/.NET 4.5上運行)也將提供該修補程序,因爲它取代了自帶.NET 4版本的System.Data.Entity.dll。

相關問題