2009-12-25 95 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。

相关问题