[英]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; }
}
我正在對這兩個表進行幾項操作。 我想運行一個讀取,做一些檢查,然后回寫。 我擔心的是並發性。 例如:
收到在文件夾“賈米森”中創建文件“Samuel”的請求
收到在文件夾“賈米森”中創建文件夾“Samuel”的請求
檢查是在應用程序中完成的,那么如何確保檢查不會成功並導致成功的創建操作?
我的第一個想法是交易,但我覺得我需要改變隔離級別或做一些悲觀鎖定。 或者可能采用不同的方法? 你們如何在實體框架中解決這個問題?
建議的EF並發處理是樂觀並發。 基本上,您需要向模型添加Timestamp列,並將此列指定為並發處理:
[Timestamp]
public DateTimeOffset UpdatedDate { get; set; }
這將指示EF檢查實體時間戳的當前值是否與數據庫中的版本匹配; 如果它確實操作將成功,否則將拋出DbUpdateConcurrencyException並且您可以捕獲它以向用戶顯示錯誤消息。
在這里查看更多詳情。
如何使用這種方法,每次添加文件或子文件夾時都要修改Parent的UpdatedDate值(這將確保只傳遞一個操作)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.