2017-04-13 58 views
1

我的道歉,如果這已經問...樹結構,唯一的名稱/父,實體框架的交易或鎖定

我有一些EF模型類是這樣的:

public class Folder 
{ 
    [Key] 
    [Column("folder_id")] 
    public int FolderId { get; set; } 

    [Required] 
    [Column("organization_id")] 
    public int OrganizationId { get; set; } 
    public virtual Organization Organization { get; set; } 

    [Column("name")] 
    [MaxLength(MAX_NAME_LENGTH)] 
    public string Name { get; set; } 

    [Column("parent_folder_id")] 
    public int? ParentFolderId { get; set; } 
    [ForeignKey("ParentFolderId")] 
    public virtual Folder ParentFolder { get; set; } 

    public virtual ICollection<File> Files { get; set; } 
    public virtual ICollection<Folder> Folders { get; set; } 
} 

public class File 
{ 
    [Key] 
    [Column("file_id")] 
    public int FileId { get; set; } 

    [Column("name")] 
    [Required] 
    public string Name { get; set; } 

    [Column("folder_id")] 
    [Required] 
    public int FolderId { get; set; } 
    public virtual Folder Folder { get; set; } 

} 

我的工作對這兩個表格進行了幾項操作。我想運行一個閱讀,做一些檢查,然後回寫。儘管我擔心的是併發。例如:

  1. 創建文件「塞繆爾」在文件夾「賈米森」接收請求

    • 檢查,看看有沒有文件或文件夾名爲「撒母耳記」中的「賈米森」
    • 創建文件「塞繆爾」在文件夾「賈米森」
  2. 在文件夾「賈米森」創建文件夾「塞繆爾」接收請求

    • 檢查,看看有沒有在「賈米森」命名爲「塞繆爾」文件或文件夾
    • 創建文件夾文件夾「塞繆爾」,「賈米森」

這些檢查是在應用程序完成,那麼我怎樣才能確保這些支票不會都成功並導致成功的創建操作?

我的第一個想法是交易,但我覺得我需要改變隔離級別或做一些悲觀的鎖定。或者,也許是另一種方法?你們如何在Entity Framework中解決這個問題?

回答

0

建議的EF併發處理是樂觀併發。 基本上,你需要一個時間戳列添加到您的模型,並指定此列是併發處理:

[Timestamp] 
public DateTimeOffset UpdatedDate { get; set; } 

這將指示到EF檢查,如果你的實體時間戳的當前值中的版本匹配數據庫;如果這樣做,操作將成功,否則將引發DbUpdateConcurrencyException,並且可以捕獲它以向用戶顯示錯誤消息。

查看here瞭解更多詳情。

如何使用此方法,每次添加文件或子文件夾時都會修改Parent的UpdatedDate值(這將確保只有一個操作會通過)。

+0

謝謝你的迴應。不過,我覺得這可以確保我不覆蓋更新的行。這裏的問題是我需要確保不同的行在彼此之間保持完整性。換句話說,我需要確保當我更新一行時,沒有其他具有相同ParentFolderId的行具有相同的名稱,等等。編輯:雖然,也許我只是不理解你的答案可以用來解決我的問題? –

+0

想想更多,我想我可以排隊一堆操作。我做我的支票,我更新ParentFolder上的日期,然後保存。我的假設是,如果存在併發異常,編輯中的任何一個都不會通過。然後,我只需要更新每個修改父級內部操作的操作的日期。以這種方式,我確保沒有兩個操作針對同一個父對象發生,而不會引發異常。這聽起來正確嗎? –

+0

附加問題,是否有更新只有時間戳字段?我使用的是按照您顯示的鏈接中指定的byte []數組而不是DateTimeOffset。我沒有修改父行的任何內容,我更像是使用同步構造。 –