我正在使用实体框架与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但它更多的是暗示没有太多的细节
我试着切出所有与代码无关的东西 - 所以如果有一些错别字,他们在帖子中;不一定在代码本身! 谢谢