2017-09-06 14 views
1

はねえ、私はデータベースにツリー構造の種類を表すいくつかのオブジェクト配置したい、同時に2つの要求:割り当てエンティティID、ない、

各TreeNodeの要素は、一意のIDを持っている必要があります。私はアプリ

  { 
    "name": "Tree Node 1", 
    "children": 
    [{ 
     "name": "Tree Node 2", 
     "children": 
     [{ 
      "name": "Tree Node 3", 
      "children": 
      [{ 
       "name": "Tree Node 4", 
       "children": 
       [{ 
        "name": "Tree Node 5", 
        "children": 
        [{ 
         "name": "Tree Node 6", 
         "children": [], 
         "data": 
         { 
         } 
        }] 
       }, 
       { 
        "name" : "Tree Node embeded parent 4", 
        "children": [], 
        "data": 
        { 

        } 
       }] 
      }] 
     }] 
    }] 
}  

の手前側からrecived

私のTreeNode

public class TreeNode 
{ 
    public int Id { get; set; } 
    public int ParentId { get; set; } 
} 

データ私の問題はある - 私は、各ノードに対して正しいIDを割り当てることができますか?

私の現在の解決策は、最後のIDが挿入されたデータベースから取得しています。これを使用して、それを最終的なTreeObjectに割り当てます。それは動作しますが、私は十分に良いものではありません。

このソリューションには少なくとも1つの大きな欠点があります.2人のユーザーが同時にデータベースにデータをプッシュしようとするとどうなりますか?

ユーザーAが「保存」ボタンをクリックしたとします。 TreeProcessorは、データベースから取得したもので、100が最後に挿入されたという情報です。 はTreeProcessor(例えばIDを割り当てる)処理データで終了した後、 データをデータベースに送信する準備ができているが、突然接続がスローダウンしているネットワーク...

同時に、ユーザーBは、あまりにも「保存」をクリックしたが、と別のデータ。 ユーザAのデータがまだ届かないため、データベースは最後に挿入されたIDとして100を送信しました.....

+0

Guidをキーに使用する、 'public Guid Id {get;セット; } '。 –

答えて

0

データベーステーブルのIDカラムを使用してIDを割り当てることができますか?使用したアイデンティティーを挿入して返すプロシージャを作成し、ツリーの下を進みます。

または、トランザクションで操作をラップして、ユーザーAが自分のデータを書き込むまでユーザーBがIDを取得できないようにします。 C#でこれを行う方法、または可能であればデータベース内でそれを行う方法については、Google TransactionScope(全体のアーキテクチャを質問から区別することはできません)。