C # / Linq-to-sql - Блокировка текстового текста. Таблица на вставке - PullRequest
3 голосов
/ 26 октября 2011

В настоящее время я создаю метод в своем классе доступа к данным, который будет вставлять объект сущности в базу данных, и я ожидал получить последний вставленный идентификатор впоследствии ... и я уже сделал это, но потом я Интересно, что произойдет, если метод будет вызван дважды одновременно, вернет ли он неправильный идентификатор?

Так что в качестве обходного пути я решил заблокировать таблицу на моем текстовом тексте:

lock(dataContext.Persons)
{
    InsertOnSubmit(person);
    dataContext.SubmitChanges();
}

но я чувствую, что это неуместно ... Я имею в виду, что таблица не большая, и для передачи изменений не потребуется много времени ... Таким образом, мой вопрос, с какими проблемами я столкнусь, заблокировав это так?

PS: Дайте мне знать, если мой вопрос недостаточно ясен, и я его отредактирую!

Ответы [ 2 ]

1 голос
/ 26 октября 2011

Я не уверен, является ли это частью ваших проблем, но если вы используете TransactionScope, вы можете передать TransactionOption, который будет иметь дело с несколькими транзакциями.

Оформить TransactionOption.Isolationlevel

1 голос
/ 26 октября 2011

Нет необходимости блокировать ваш стол.

LINQ-to-SQL автоматически заполнит ваше поле ID идентификатором из базы данных при вашем вызове .SubmitChanges(), когда вы вставите person.

Предупреждение:и ваша база данных, и объект L2S должны определить ваше поле ID как идентификатор .В вашей сущности Person это поле должно быть определено как первичный ключ IsDbGenerated=true, UpdateCheck=never и иметь правильный тип базы данных.

После отправки вы сможете просто получитьID от вашей Person сущности:

dataContext.Persons.InsertOnSubmit(person);
dataContext.SubmitChanges();
var id = person.ID; // now has the database generated identity.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...