2011-01-10 32 views
0

爲了在我們的Linq Dataclasses中表示我們的課程樹結構,我們有兩列可能與PK相同。Next Identity Key LINQ + SQL Server

我的問題是,如果我想要插入一條新記錄並使用生成的PK填充其他兩列,我無法獲得下一個身份並停止與其他可能執行相同插入的管理員的衝突與此同時。

案例:葉節點已經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 2011-03-08 21:06:19

回答

1

您不會自己生成標識,或直接設置FK的標識值。

因此,簡化了下來(因爲你的結構並不十分清楚)

如果你的人表如下所示:

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

然後在LINQ你的人類應該是這樣的:

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,並將它們插入到子記錄中。

如果您嘗試使用自引用或循環鏈接,那麼無法在我知道的單個事務中執行此操作。

您將不得不先插入您的記錄(並且最初保留它們的引用爲空),然後再回來並稍後更新引用。

0

如果您使用的是LINQ-to-SQL,則應該有相應的pre_req.leftpre_req.right屬性,該屬性對應要設置的pre_req實體對象。如果是這樣的話,那麼就這樣做:

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); 

    // ... 

這將指示LINQ到SQL層爲您確定新的ID。