使用EF code first和asp.net mvc4遇到的问题总结
最近使用EF code first和asp.net mvc4做项目,遇到些问题,记录一下。
一、EF code first 生成外键列问题。
一般情况下,都是先写一个int型外键id属性,然后写一个外键对象属性,也就是导航属性。
public class UserInfoDemo { //用户组外键Id public int GroupId { get; set; } //用户组外对象 public virtual UserGroup UserGroup { get; set; } }
但是这样写会在数据库里生成2个字段,GroupId和UserGroup_Id,这是我们不愿意看到的。经过研究和对比发现,如果要在数据库只生成1列,那么实体类int型外键属性必须定义成 外键对象属性名+Id 形式,如下:
public class UserInfoDemo { //用户组外键Id 定义成外键对象+Id形式 public int UserGroupId { get; set; } //用户组外对象 public virtual UserGroup UserGroup { get; set; } }
二、asp.net mvc中使用DropDownListFor 外键列表
1.关于异常 不存在具有键“XXX”的“IEnumerable<SelectListItem>”类型的 ViewData 项。
原因是后台需要准备Ienumerable<SelectListItem>数据,存放到ViewData[key]中,cshtml在取数据的时候key不要写错,就可以了。
2.关于异常:对一个或多个实体的验证失败。有关详细信息,请参见“EntityValidationErrors”属性。
如果cshtml中这样写:@Html.DropDownListFor(m => m.UserGroup.Id, items) ,使用外键对象.Id的形式会报这个错。
原因是又会根据得到的UserGroup对象去数据库添加一条UserGroup数据,而此时UserGroup对象只有Id这一个数据的数据,如果还有其他属性的话,比如Name等等,则为null,导致报错。这是我们不愿看到的,因为对于外键列的下拉列表数据有专门的地方去添加,不能因为添加一个User数据,也把UserGroup外键对象也添加了。
解决:@Html.DropDownListFor(m => m.UserGroupId, items),直接使用int型的属性,不要用对象.Id的形式即可。
先写这么多,遇到错误再补充。