2011-01-10 5 views
0

私たちのコースツリー構造をLinq Dataclassesで表現するために、2つの列があり、それらはPKと潜在的に同じです。次のIDキーLINQ + SQLサーバー

私の問題は、新しいレコードを挿入し、生成されたPKで2つの他の列を設定したい場合、次のIDを取得して、同じ挿入を行っている可能性のある他の管理者同時に。

ケース:リーフノードはright_idたとleft_id =そのもの(prereq_id)

**dbo.pre_req:** 
prereq_id 
left_id 
right_id 
op_id 
course_id 
is_head 
is_coreq 
is_enforced 
parent_course_id 

、私は基本的にこれをしたい:

 pre_req rec = new pre_req 
     { 
      left_id = prereq_id, 
      right_id = prereq_id, 
      op_id = 3, 
      course_id = query.course_id, 
      is_head = true, 
      is_coreq = false, 
      parent_course_id = curCourse.course_id 
     }; 

     db.courses.InsertOnSubmit(rec); 

     try 
     { 
      db.SubmitChanges(); 
     } 

私のジレンマを解決するための任意の方法は?ありがとう!

+0

これはランダムな質問ですが、これはカスタムデータベースですか、ソフトウェアの一部ですか? – kylex

答えて

1

自分でIDを生成したり、FKのID値を直接設定したりすることはありません。

Id int IDENTITY(1,1) 
    Name nvarchar(MAX) 
    MotherId int NULL (FK -> Person.Id) 
    FatherId int NULL (FK -> Person.Id) 

が続いてLINQでのPersonクラスは次のようになります。

だから、(あなたの構造はそれほど明確ではないので)

ものを下に簡素化することはあなたのPersonテーブルは次のようになります場合は

public class Person 
{ 
    public int Id { get; set;} 
    public string Name { get; set;} 
    public Person Mother { get; set;} 
    public int? MotherId { get; set;} 
    public Person Father { get; set;} 
    public int? FatherId { get; set;} 
} 

挿入するときは、これを行うことができます:

var mother = new Person { Name = "April Smith" }; 
var father = new Person { Name = "Bob Smith" }; 
var child = new Person { Name = "Charlie Smith", Mother = mother, Father = father}; 

db.People.InsertOnSubmit(mother); 
db.People.InsertOnSubmit(father); 
db.People.InsertOnSubmit(child); 

LINQ-to-SQLは、生成された母親と父親のIDを取得し、子レコードに挿入する必要があります。

自己参照リンクまたは循環リンクを使用しようとしている場合は、わかっている1つのトランザクションでこれを行う方法はありません。

最初にレコードを挿入し(最初はその参照をnullのままにしておく必要があります)、後で参照を戻して更新する必要があります。

0

LINQ-to-SQLを使用している場合、設定するpre_reqエンティティオブジェクトに対応する対応するpre_req.leftおよびpre_req.rightプロパティが存在する必要があります。その場合は、その後、ちょうどこの操作を行います。

pre_req rec = new pre_req 
    { 
     op_id = 3, 
     course_id = query.course_id, 
     is_head = true, 
     is_coreq = false, 
     parent_course_id = curCourse.course_id 
    }; 

    rec.left = rec; 
    rec.right = rec; 

    db.courses.InsertOnSubmit(rec); 

    // ... 

これはあなたのための新しいIDを決定するために、LINQツーSQL層に指示します。

関連する問題