тихий сбой при обновлении строки через linq до sql - PullRequest
0 голосов
/ 26 апреля 2011

У меня есть некоторый код на C #, похожий на следующий пример:

foreach (car c in listOfCars) {
  c.garage.last_opened_at = DateTime.Now;
}
db.SubmitChanges();

По сути, cars и garages находятся в отношениях один к одному (я знаю, что это несколько ошибочный пример), и я обновляю время последнего открытия каждого гаража.

Когда я проверяю базу данных, поле last_opened_at не обновляется (сообщения об ошибках не отображаются). Есть предложения почему? Я осмотрел SO и Google, и все решения, которые я видел, упоминали, что garage должен иметь первичный ключ. Но я дважды проверил, и моя таблица garage действительно использует свой внешний ключ для связанного с ней автомобиля в качестве первичного ключа.

Проблема в том, что первичный ключ также удваивается как внешний ключ (т. Е. Нужен ли мне столбец выделенного первичного ключа)?

Ответы [ 3 ]

1 голос
/ 26 апреля 2011

Здесь есть несколько возможностей: last_opened_at указано как поле базы данных, у вас нет первичного ключа, указанного в вашем классе linq to sql, и менее вероятно, что ваш listOfCars не имеет того же контекста БД.

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

Если вы это сделаетене иметь первичного ключа в классе linq to sql, независимо от того, что делает база данных, он не будет записывать в таблицу.Иметь первичный ключ также как внешний ключ не должно быть проблемой, если он является первичным.Я столкнулся с этим один раз и подумал, что вспомнил ошибку в этом случае, но я не уверен на 100%.

Если вы генерируете listOfCars из одного контекста данных и пытаетесь сохранить их в других данныхконтекст, второй контекст данных даже не подозревает, что эти сущности существуют.Вы можете решить эту проблему, убедившись, что используете тот же контекст данных или присоединяете сущности к новому контексту.

0 голосов
/ 26 апреля 2011

Вы пропустили звонок, чтобы обновить модели.Я считаю, что ваш пример должен выглядеть следующим образом:

foreach(car c in listOfCars) {
    c.garage.last_opened_at = DateTime.Now;
}
db.AcceptAllChanges();
db.SubmitChanges();

Кроме того, обновления никогда не будут молча проваливаться.Если обновление завершится неудачей, оно выдаст исключение UpdateException.В вашем случае происходит то, что ваш код будет обновляться, но не видит обновлений, принятых в моделях, и, следовательно, ничего не обновляет.Если у вас возникла проблема с ограничениями первичного или внешнего ключа, вы получите исключение.

0 голосов
/ 26 апреля 2011

Что если вы переместите вызов на SubmitChanges внутри своего цикла?

foreach (car c in listOfCars) {
  c.garage.last_opened_at = DateTime.Now;
  db.SubmitChanges();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...