我使用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字段被設置爲更新發生的日期和時間 - 我不希望這樣做。
有誰知道一種方法來利用所有插入,更新和刪除操作的存儲過程,並沒有更新級聯到相關的實體?
只是爲了確保沒有其他代碼與您的錯誤相關聯? – Nix 2010-05-28 18:46:44
我沒有看到錯誤。我只是沒有看到我期望的行爲,我想知道爲什麼和我需要做什麼才能看到預期的行爲,即只有Address實體在數據庫中得到更新。 唯一的其他代碼將是我的上下文對象的實例化,它只是創建一個EF生成的實體上下文的新實例。 – Filosopher 2010-05-28 18:56:30
更新:正如我在我原來的發佈中所說的,我使用存儲過程來處理所有我的表上的創建,更新和刪除。我只是從我的Model中刪除這些映射,然後在Person表上使用DB觸發器再次運行代碼,並且沒有發生更新。看起來像是創建,更新和刪除的sproc映射,導致更新發生在這種情況下。不幸的是,我們不得不爲這些操作使用sprocs,因此仍然需要解決方案。我只是想我會用更多的信息更新這篇文章。 – Filosopher 2010-05-28 20:11:34