2017-04-13 10 views
1

私の謝罪をロック...ツリー構造、ユニークな名前/親、Entity Frameworkの取引や、これは前に頼まれている場合

私はこのようないくつかの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; } 

} 

を私が働いていますこれらの2つのテーブルに対していくつかの操作を行います。私は読書をし、いくつかの小切手をしてから、書き返したいと思います。私の懸念は並行性です。例えば:フォルダ内の

  1. ファイルを作成するための要求「サミュエル」「ジャミソンは」を参照してくださいする

    • チェックを受けている「ジャミソン」
    • に「サミュエル」という名前のファイルまたはフォルダなしはありません
    • 作成ファイルフォルダ内の「サミュエル」「ジャミソン」
  2. フォルダ「ジャミソン」のフォルダ「サミュエル」を作成するための要求を受信する

    • チェック

チェック アプリで行われている「ジャミソン」に「サミュエル」という名前のファイルまたはフォルダ

  • フォルダ内のフォルダ「サミュエルの」作成「ジャミソン」はありません確認してくださいチェックが成功せず、作成操作が成功することを確実にする方法を教えてください。

    私の最初の考えはトランザクションでしたが、分離レベルを変更したり、悲観的なロックを行う必要があると感じました。それとも別のアプローチですか?あなたはEntity Frameworkでこの問題にどのようにアプローチしますか?

  • 答えて

    0

    EFの推奨並行処理は、オプティミスティック同時実行性です。 は基本的に、あなたはあなたのモデルにタイムスタンプ列を追加し、同時実行の取り扱いになるこの列を指定する必要があります:あなたのエンティティのタイムスタンプの現在の値がでバージョンと一致した場合

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

    は、これはチェックするためにEFに指示されますデータベース;そうでなければ操作は成功し、そうでない場合はDbUpdateConcurrencyExceptionがスローされ、それを捕まえてエラーメッセージをユーザーに表示することができます。

    詳細はhereをご覧ください。

    ファイルやサブフォルダを追加するたびに、この方法を使用する方法は、親のUpdatedDate値を変更します(これにより、1つの操作だけが確実に実行されます)。

    +0

    ありがとうございます。しかし、私は更新された行を上書きしないことを保証していると感じています。ここで問題となるのは、異なる行が互いに完全性を維持していることを保証する必要があるということです。言い換えれば、同じParentFolderIdを持つ他の行が同じ名前を持つ行を更新しないようにする必要があります。編集:あなたの答えが私の問題を解決するためにどのように使用できるのか理解できないでしょうか? –

    +0

    これ以上考えてみると、たくさんの操作を列挙できると思います。私は私の小切手をする、私はParentFolderの日付を更新し、保存します。私の前提は、並行処理の例外がある場合です。編集のNONEは通過します。次に、親の中の何かを変更するすべての操作の日付を更新するだけです。このようにして、例外がスローされることなく、同じ親に対して2つの操作が行われないようにします。これは正しいのですか? –

    +0

    アドオンに関する質問、タイムスタンプフィールドのみを更新する予定はありますか?私はDateTimeOffsetの代わりにあなたが示したそのリンクに指定されているように、byte []配列を使用しています。私は親行について何も変更していないので、私はそれを同期構造のように使っています。 –

    関連する問題