我正在使用實體框架與asp.net mvc,但我不認爲mvc在這裏扮演重要角色。實體框架在* lookup *表上拋出SqlDate異常
我有一個對象客戶和查找表(有幾個,他們都表現相同的方式;所以爲了簡單起見,我將選擇領土)。客戶和地區都有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();
}
正如我所說的,沒有問題。但是,如果我在視圖中使用匹配id(Territory.ID)的下拉列表,則會出現問題。我在控制器下面一行:
ViewData["territory"] = new SelectList(repo.Territory, "ID", "Name", 1);
和相應的線在查看:
Territory: <%= Html.DropDownList("Territory.ID", (IEnumerable<SelectListItem>)ViewData["territory"])%>
我得到一個好消息和一個壞消息:好消息是,我得到的領土ID很好地分配給Customer對象的相應成員。壞消息是Territory.LastUpdated值設置爲1/01/0001。顯然,我不關心這個值 - 但它看起來像EF關心。當我打電話的SaveChanges我收到以下錯誤:
SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM
看起來像EF正試圖從數據庫中檢索的值,然後將其與EF值...也許別的東西比較 - 但底線是我無法弄清楚如何防止它試圖變得如此聰明。
現在,我的名字下拉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();
這工作(這讓我舒服,我的分析)但這不是最好的方法。 我也不能相信沒有人碰到了這樣的問題 - 但我無法找到任何相關信息......我能找到的最好的是link text但它更多的是暗示沒有太多的細節
我試着切出所有與代碼無關的東西 - 所以如果有一些錯別字,他們在帖子中;不一定在代碼本身! 謝謝