Следующий ключ идентификации LINQ + SQL Server - PullRequest
0 голосов
/ 10 января 2011

Для представления нашей древовидной структуры курса в наших классах данных Linq у нас есть 2 столбца, которые потенциально могут совпадать с PK.

Моя проблема в том, что если я хочу вставить новую запись и заполнить 2 других столбца сгенерированным 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();
        }

Есть ли способ решить мою дилемму? Спасибо!

Ответы [ 2 ]

1 голос
/ 10 января 2011

Вы сами не генерируете Identity или не устанавливаете значения ID для FK.

Итак, все упрощается (потому что ваша структура не очень понятна)

Если ваша таблица Person выглядит следующим образом:

   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 должен знать, чтобы получить сгенерированные идентификаторы для матери и отца и вставить ихв записи ребенка.

Если вы пытаетесь использовать самоссылочную или кольцевую ссылку, то нет способа сделать это в одной транзакции, о которой я знаю.

Вы должны будете сначала вставить свои записи (и оставить их ссылки изначально нулевыми), а затем вернуться и обновить ссылки позже.

0 голосов
/ 10 января 2011

Если вы используете LINQ-to-SQL, то должно быть соответствующее свойство pre_req.left и pre_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-to-SQL определить новый идентификатор для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...