2012-11-06 56 views
1

對於始終保持實體框架中數據完整性的最佳方法,是否有共識?即添加或刪除實體時,如何確保加載的模型是最新的,並且我背後的數據庫沒有任何變化?實體框架中的數據完整性

在大多數情況下,似乎適用於我的粗略方法是在會話之間重新加載上下文,即不具有持久性模型,並在發生錯誤時重新加載/刷新。這似乎適用於數據衝突較少的情況,但是如果在不同的服務中發生大量變化,則代價非常高。是否有一個標誌可以查詢磁盤上的數據/行是否發生了變化或者是否使事件自動刷新,即更新某些表/行的任何訂戶?

回答

2

您可能需要樂觀的併發性。在提交之前,EF可以自動檢查數據的任何更改,並且如果數據在當前上下文之外發生更改,則會引發異常。請參閱http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/handling-concurrency-with-the-entity-framework-in-an-asp-net-mvc-application

+0

OC爲+1。您還應該考慮工作單元模式,它補充了管理使用的上下文生命週期的最佳方法。 http://blogs.msdn.com/b/adonet/archive/2009/06/16/using-repository-and-unit-of-work-patterns-with-entity-framework-4-0.aspx – Nick

+0

謝謝一堆將看看這個 – aggaton

0

您可以在EF中使用併發功能做一些很酷的事情。

具體而言,我有一個屬性HandleConcurrencyExceptionAttribute,您可以在MVC項目中使用它來自動掛鉤實體框架將拋出​​的DbConcurrencyException。 https://github.com/adamtuliper/EF5-for-Real-Web-Applications

如果您使用的是網頁表單(或win forms/wpf),您將不得不手動檢查它。搜索web表單項目DbConcurrencyException

所以基本上:

  1. 有一個數據庫中的rowversion領域,稱之爲「時間戳」
  2. 設置你的實體領域有一個[時間戳]

[Timestamp] public byte[] Timestamp { get; set; }

  1. 保存後EF將確保被更新的行具有當前的t imestamp。如果行數更新= 0,則會拋出異常,因爲該行不再存在或已被修改,並且SQL Server在最後一個人保存其更改時自動遞增行列。

如果你想看到它在行動看到我的視頻的結尾:http://channel9.msdn.com/Events/TechEd/NorthAmerica/2012/DEV215 我談論併發短暫和有一個快速演示。

對於你的問題的第二部分,存在的SqlCacheDependency類 http://msdn.microsoft.com/en-us/library/ms178604(v=vs.100).aspx 還有最近在MSDN一篇關於這一點。

+0

非常感謝,將看看這個 – aggaton