Entity Framework создает исключение SqlDate для таблицы * lookup * - PullRequest
0 голосов
/ 25 декабря 2009

Я использую Entity Framework с asp.net mvc, но я не думаю, что mvc играет здесь большую роль.

У меня есть объект Customer и таблица поиска (их несколько, и все они ведут себя одинаково; поэтому для простоты я выберу Territory). И клиент, и территория имеют поле LastUpdated (дата и время задаются вручную в коде).

Если я жестко закодирую территорию и получаю только данные о клиентах из представления, у меня нет проблем:

public ActionResult CreateCustomer([Bind(Exclude = "CustId")] Customer cm) {
    cm.Territory = (from t in repo.Territory where t.ID == 2 select t).First();
    repo.AddToCustomer(cm);
    repo.SaveChanges();
}

Как я уже сказал, проблем нет. Однако, если я использую выпадающий список с соответствующим идентификатором (Territory.ID) - возникает проблема. У меня есть следующая строка в контроллере:

ViewData["territory"] = new SelectList(repo.Territory, "ID", "Name", 1);

и соответствующая строка в представлении:

Territory: <%= Html.DropDownList("Territory.ID", (IEnumerable<SelectListItem>)ViewData["territory"])%>

Я получаю хорошие и плохие новости: хорошая новость заключается в том, что я получаю идентификатор территории, назначенный соответствующему участнику объекта Customer. Плохая новость заключается в том, что Territory.LastUpdated установлено значение 1/01/0001. Очевидно, I не заботится об этом значении - но похоже, что EF заботится. Когда я вызываю SaveChanges, я получаю следующую ошибку:

переполнение SqlDateTime. Должно быть между 01.01.1753 12:00:00 и 31.12.9999 11:59:59 PM

Похоже, EF пытается извлечь значение из базы данных, а затем сравнить его со значением EF ... или, может быть, с чем-то другим, но суть в том, что я не могу понять, как предотвратить попытки его получения такой умный.

Пока я называю DropDown ID чем-то другим («terID» вместо «Territory.ID») и использую FormCollection:

int terID = Int32.Parse(formData["terID"]);
cm.Territory = (from d in repo.Territory
     where d.ID == terID select d).First();

Это работает (что делает меня удобным для моего анализа), но это не может быть лучшим способом. Я также не могу поверить, что никто не сталкивался с такой проблемой - но я не смог найти ничего подходящего ... Лучшее, что я смог найти, это текст ссылки , но это скорее подсказка без подробностей

Я пытался вырезать из кода все несвязанные вещи - поэтому, если есть опечатки, они есть в посте; не обязательно в самом коде! Спасибо

Ответы [ 2 ]

1 голос
/ 25 декабря 2009

Territory.LastUpdated устанавливается в значение по умолчанию, так как EF сохраняет всю строку / что изменилось, вы получаете исключение.

Простой способ исправить это - установить DateTime.Now перед сохранением.

0 голосов
/ 25 декабря 2009

Я предполагаю, что вы используете EF 1.0, который не подходит для прямого внешнего ключа.

Территория, опубликованная от просмотра к действию, не привязана к Datacontext, поэтому при сохранении объекта клиента - EF также сохраняет присоединенный объект территории.

Вы должны сначала получить объект Territory из базы данных, а затем назначить его клиенту.

И ваше решение прекрасно, потому что другого для EF 1.0 нет - -:

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