簡體   English   中英

如何在 Entity Framework 6 Database First 中對導航屬性實現樂觀並發

[英]How to implement optimistic concurrency on navigation properties in Entity Framework 6 Database First

如果您的實體上有導航屬性(即父表和子表之間的多關系),那么在 Entity Framework Database First 中實現樂觀並發的慣用方法是什么? 您是否需要檢查父實體和子實體的行版本,或者是否存在這樣的情況,僅檢查父實體的行版本就足以知道是否更新了任何子表以及任何父表?

考慮 2 個表:

Table Parent {
   ParentId INT PRIMARY KEY,
   ValueParent INT
   Version ROWVERSION
}


Table Child {
   ParentId INT FOREIGN KEY
   ChildId INT,
   ValueChild INT
   Version ROWVERSION
  (ParentId,ChildId) Primary Key
}

轉換為實體后,表格將如下所示:

class Parent{
   int ParentId;
   int valueParent;
   byte[] version;
   virtual ICollection<Child> Children
}

class Child{
   int parentId;
   int childId;
   int valueChild;
   byte[] version;
}

如果我加載一個Parent object,並且只更新它的子實體,

parent.Children.ElementAt(0).valueChild = 1 //

在 db 中,子實體中的 rowversion 將遞增,但父 rowversion 將保持不變。 那有效嗎? 如果我想實現樂觀並發,我仍然需要對父級和子級進行行版本檢查,以確保 model 沒有改變。 我可以將兩個實體上的版本的concurrency mode設置為fixed ,但這不會阻止在我進行更新之前必須在開始時進行檢查,對嗎?

如果您的實體之間有一對多關系,那么實現樂觀並發的慣用方法是什么? 有什么方法可以做到這一點,我只需要檢查父行版本,還是我總是需要檢查任何子元素的行版本?

對每一行進行樂觀並發檢查,您只需將列配置為Timestamp/Rowversion ,EF 將為您生成並發檢查。

有什么方法可以做到,我只需要檢查父 rowversion

正如@Jeremy Lakeman 所建議的那樣,如果您總是在任何孩子發生變化時更新父母,那么可以檢測和防止來自您的 EF 應用程序的並發違規行為。 但它不能防止對子行的臨時更新。

暫無
暫無

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

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