Я использую 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();
Это работает (что делает меня удобным для моего анализа), но это не может быть лучшим способом.
Я также не могу поверить, что никто не сталкивался с такой проблемой - но я не смог найти ничего подходящего ... Лучшее, что я смог найти, это текст ссылки , но это скорее подсказка без подробностей
Я пытался вырезать из кода все несвязанные вещи - поэтому, если есть опечатки, они есть в посте; не обязательно в самом коде!
Спасибо