我使用实体框架5和MVC 4,.NET 4.5使用Code First迁移。我有两个实体之间的外键以1到0或1的关系。当我尝试为慢跑者创造记录时,一切都会爆炸。我得到的要么是错误消息:分配UserId到外键= null
- 外键为空引用
- dbo.Jogger不存在
- 未处理的异常......没有元数据。
当我运行EF浏览器的导航关系是完美的。目前没有使用Fluent API代码。
用户类
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string UserName { get; set; }
// Other properties
public int? JoggerId { get; set; }
public virtual Jogger Jogger { get; set; }
慢跑类
[ForeignKey("UserId")]
public int JoggerId { get; set; }
public virtual UserProfile UserId { get; set; }
当JoggerController产生它产生用于GET和POST方法的代码:
// GET: /Jogger/Create
public ActionResult Create()
{
ViewBag.JoggerId = new SelectList(db.UserProfiles, "UserId", "UserName");
return View();
}
//
// POST: /Jogger/Create
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Jogger jogger)
{
if (ModelState.IsValid)
{
db.Jogger.Add(jogger);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.JoggerId = new SelectList(db.UserProfiles, "UserId", "UserName", jogger.JoggerId);
return View(jogger);
}
在Jogger/Create视图中,根据生成的代码,没有用于JoggerId或UserId的字段。
通常,它在输出显示JoggerId = 0和UserId = null的代码的(ModelState.IsValid)部分上失败。
我在asp.net网站上的Contoso University教程上没有看到这种行为,我也查看了MSDN学习EF网站。我似乎无法解决这个问题。你的建议表示赞赏。
感谢@Moeri我没有你在上半场利用公共虚拟用户配置用户配置建议的修改),但它仍然给了我(模型是有效的),同样的错误。当添加失败时,JoggerId仍然设置为0。 – Springbokkie
我不知道是否有一些与我的解决方案从根本上有缺陷的,因为即使当我手动在慢跑表中输入数据库值输入用户ID仍杀死模型只是观看手动输入的慢跑者的纪录。 – Springbokkie