2011-01-10 31 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。