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; }
}
我的工作對這兩個表格進行了幾項操作。我想運行一個閱讀,做一些檢查,然後回寫。儘管我擔心的是併發。例如:
創建文件「塞繆爾」在文件夾「賈米森」接收請求
- 檢查,看看有沒有文件或文件夾名爲「撒母耳記」中的「賈米森」
- 創建文件「塞繆爾」在文件夾「賈米森」
在文件夾「賈米森」創建文件夾「塞繆爾」接收請求
- 檢查,看看有沒有在「賈米森」命名爲「塞繆爾」文件或文件夾
- 創建文件夾文件夾「塞繆爾」,「賈米森」
這些檢查是在應用程序完成,那麼我怎樣才能確保這些支票不會都成功並導致成功的創建操作?
我的第一個想法是交易,但我覺得我需要改變隔離級別或做一些悲觀的鎖定。或者,也許是另一種方法?你們如何在Entity Framework中解決這個問題?
謝謝你的迴應。不過,我覺得這可以確保我不覆蓋更新的行。這裏的問題是我需要確保不同的行在彼此之間保持完整性。換句話說,我需要確保當我更新一行時,沒有其他具有相同ParentFolderId的行具有相同的名稱,等等。編輯:雖然,也許我只是不理解你的答案可以用來解決我的問題? –
想想更多,我想我可以排隊一堆操作。我做我的支票,我更新ParentFolder上的日期,然後保存。我的假設是,如果存在併發異常,編輯中的任何一個都不會通過。然後,我只需要更新每個修改父級內部操作的操作的日期。以這種方式,我確保沒有兩個操作針對同一個父對象發生,而不會引發異常。這聽起來正確嗎? –
附加問題,是否有更新只有時間戳字段?我使用的是按照您顯示的鏈接中指定的byte []數組而不是DateTimeOffset。我沒有修改父行的任何內容,我更像是使用同步構造。 –