簡體   English   中英

樹結構,唯一名稱/父,實體框架事務或鎖定

[英]Tree structure, unique names/parent, Entity Framework transactions or locking

如果以前有人問過我,我很抱歉......

我有一些像這樣的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. 收到在文件夾“賈米森”中創建文件“Samuel”的請求

    • 檢查“Jamison”中是否沒有名為“Samuel”的文件或文件夾
    • 在文件夾“Jamison”中創建文件“Samuel”
  2. 收到在文件夾“賈米森”中創建文件夾“Samuel”的請求

    • 檢查“Jamison”中是否沒有名為“Samuel”的文件或文件夾
    • 在文件夾“賈米森”中創建文件夾“Samuel”

檢查是在應用程序中完成的,那么如何確保檢查不會成功並導致成功的創建操作?

我的第一個想法是交易,但我覺得我需要改變隔離級別或做一些悲觀鎖定。 或者可能采用不同的方法? 你們如何在實體框架中解決這個問題?

建議的EF並發處理是樂觀並發。 基本上,您需要向模型添加Timestamp列,並將此列指定為並發處理:

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

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

在這里查看更多詳情。

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

暫無
暫無

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

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