假设我有 3 个模型:
[Table("UserProfile")]
public class UserProfile //this is a standard class from MVC4 Internet template
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string UserName { get; set; }
}
public class Category
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Post> Posts { get; set; }
}
public class Post
{
public int CategoryId { get; set; }
public virtual Category Category { get; set; }
public int UserProfileId { get; set; }
[ForeignKey("UserProfileId")]
public virtual UserProfile UserProfile { get; set; }
}
现在,我正在尝试编辑帖子
[HttpPost]
public ActionResult Edit(Post post)
{
post.UserProfileId = context.UserProfile.Where(p => p.UserName == User.Identity.Name).Select(p => p.UserId).FirstOrDefault();
//I have to populate post.Category manually
//post.Category = context.Category.Where(p => p.Id == post.CategoryId).Select(p => p).FirstOrDefault();
if (ModelState.IsValid)
{
context.Entry(post.Category).State = EntityState.Modified; //Exception
context.Entry(post.UserProfile).State = EntityState.Modified;
context.Entry(post).State = EntityState.Modified;
context.SaveChanges();
return RedirectToAction("Index");
}
return View(post);
}
我得到了ArgumentNullException。快速查看调试,我可以看出我的Category是null,尽管CategoryId设置为正确的值。
注释掉的,看起来很讨厌的技巧解决了这个问题,但我想它根本不应该存在。所以问题是如何正确解决它。
我会说它与 EF 延迟加载有关,因为我有非常相似的代码来添加Post并且在调试中有相同的场景:正确CategoryId,Category为null并且尽管 EF 自动解决了Post <-> Category依赖,我不必使用任何额外的技巧。在编辑方法上,EF 有一些问题,但我无法弄清楚我做错了什么。