来自表单的MVC4 EF6映射参数

一般故障

将视图发送的表单数据映射到为其设计的模型类时,我遇到了问题。

我有一个老师模型:

public class Teacher : Person
{
    [Required]
    [StringLength(50)]
    public String Title { get; set; }

    [Required]
    public DateTime DateOfApproval { get; set; }

    public ICollection<ThesisApplication> ManagerOf { get; set; }
}

和ThesisApplication模型(学生填写的申请表,上面他说谁想成为他的经理)。

public class ThesisApplication
{
    public int Id { get; set; }

    public virtual Thesis Thesis { get; set; }

    [ForeignKey("Manager")]
    public virtual int ManagerId { get; set; }
    public virtual Teacher Manager { get; set; }

    //other properties that doesn't matter here
}

和流利的API之间的连接

modelBuilder.Entity<ThesisApplication>()
            .HasRequired( s => s.Manager ).WithMany(s => s.ManagerOf );

在我的表格中,我有:

@Html.DropDownListFor( x => x.ManagerId, (IEnumerable<SelectListItem>)( ViewBag.People  ) )

在哪里

ViewBag.People = new SelectList(this.databaseEntities.Teachers.All(), "PersonId", "FirstName");

但是当我像这样将表单传递给控制器​​中的create方法时

[HttpPost]
public ActionResult Create( ThesisApplication application )
{ ...

我得到了正确的managerId,但Manager属性为空(null)。尝试获取Manager的属性时,将引发异常。

有人可以解释为什么会这样。我对不使用外键的解决方案感兴趣。像DropDownFor(x => x.Manager)之类的内容可以在不使用外键的情况下映射Manager属性。

谢谢:)

毁灭者DMac

您从表单发布中看到的对象是一个普通对象,由MVC模型绑定器实例化在Entity Framework外部。如果要获取Teacher要表示对象,则必须使用DbSet.Find方法(或中的任何其他方法DbSet<Teacher>):

[HttpPost]
public ActionResult Create(ThesisApplication application )
{
    using(var context = new TeacherContext()) //or whatever/however you access your DbContext
    {
        var teacher = context.Teachers.Find(application.ManagerId);
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章