получить новый идентификатор записи с помощью LINQ To SQL - PullRequest
1 голос
/ 15 марта 2010

Используя следующее:

private BlogDataContext db = new BlogDataContext ();

article.Created = DateTime.UtcNow;
article.Modified = DateTime.UtcNow;

db.Articles.InsertOnSubmit(article);
db.SubmitChanges();

int id = article.Id;

Мне интересно, это безопасно? Это даст мне Id статьи, которую пользователь только что вставил, или будет случай параллелизма, если другой пользователь обновит статью через долю секунды после этого пользователя?

1 Ответ

4 голосов
/ 16 марта 2010

Ваш экземпляр dataContext (с именем db) будет захватывать значение идентификатора, сгенерированное базой данных во время вставки.Если другой пользователь изменяет значение после этой точки, вы не только не увидите его, но и экземпляр DataContext выдаст вам устаревшее значение при запросе!Это имеет смысл, если вы думаете о том, как DataContext должен выполнять отслеживание объектов для изменения данных.

Если вы пытаетесь добавить родительскую запись, а затем добавить дочернюю запись «безопасным» (атомарным) способом, сделайте это вместо этого:

Order o1 = new Order() {Date = DateTime.Now, Quantity = 3};
Order o2 = new Order() {Date = DateTime.Now, Quantity = 4};

Customer c1 = new Customer() {Name = "Bob"};
c1.Orders.Add(o1);
c1.Orders.Add(o2);

db.InsertOnSubmit(c1);
db.SubmitChanges();

Клиент и оба заказа будут вставлены в базу данных - все или ни одного (если их нет, вы получите исключение, объясняющее почему).Я использовал свойство отношений: Customer.Orders вместо идентификаторов.Это потому, что я не знаю, какие идентификаторы генерирует база данных.Также DataContext не знает.Но если вы изучите автоматически сгенерированный код Customer.Orders - вы увидите, что идентификатор управляется там.

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