2009-12-25 93 views
0

我正在使用實體框架與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但它更多的是暗示沒有太多的細節

我試着切出所有與代碼無關的東西 - 所以如果有一些錯別字,他們在帖子中;不一定在代碼本身! 謝謝

回答

0

我假設你使用的EF 1.0不擅長直接外鍵映射。

從視圖到操作發佈的區域未綁定到Datacontext,因此,當您保存客戶對象時,EF也會保存附加的Territory對象。

您必須先從數據庫獲取Territory對象,然後將其分配給客戶。

而你的解決方案是非常好的,因爲沒有其他的EF 1.0) - :

1

Territory.LastUpdated被設置爲默認值,因爲EF保存整個行/發生了什麼變化,你會得到一個異常。

解決此問題的簡單方法是在保存之前將其設置爲DateTime.Now。

相關問題