使用Entity Framework在POST上获取错误 – 值不能为null。 参数名称:source

编辑 – 根据要求,这是视图……

– 开始编辑

@model salesWebTest.viewModel.vwbooking @using (Html.BeginForm()) { @Html.AntiForgeryToken() @Html.ValidationSummary(true) @Html.HiddenFor(model => model.bookings.bookingid) @Html.EditorFor(model => model.bookings.name) @foreach (var item in Model.traces) { @Html.EditorFor(m => item.contact_Name) } } 

– 编辑

–start original问题我有一个包含两个类的viewModel …

 public class vwbooking { public booking bookings { get; set; } public IEnumerable traces { get; set; } } 

预订和跟踪是edmx中的实体。

我想通过一次调用来更新这两个类中的数据。

这就是我试过的……

 public ActionResult Edit(vwbooking vwbooking) { if (ModelState.IsValid) { db.bookings.Attach(vwbooking.bookings); db.Entry(vwbooking.bookings).State = EntityState.Modified; vwbooking.traces.ToList().ForEach( //THE ERROR OCCURS HERE t => { db.traces.Attach(t); db.Entry(t).State = EntityState.Modified; }); db.SaveChanges(); } } 

如果我删除了痕迹部分,预订部分将正确更新。

这是GET方法……

 public ActionResult Edit(int id = 0) { booking booking = db.bookings.Find(id); var viewModel = new vwbooking(); viewModel.bookings = booking; viewModel.traces = (from l in db.traces where l.bookingid == booking.bookingid select l); return View(viewModel); } 

这是我的db上下文类

 public class salesContext : DbContext { public salesContext() : base() { Configuration.LazyLoadingEnabled = true; } public salesContext(string Connection) : base(Connection) { Configuration.LazyLoadingEnabled = true; } public DbSet bookings { get; set; } public DbSet traces { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity().HasKey(e => e.bookingid); modelBuilder.Entity().HasKey(e => e.traceid); } } 

问题似乎是编辑器的设置方式。 我认为这导致模型在提交时没有正确绑定

 @Html.EditorFor(m => item.contact_Name) 

如果你要检查这个帮助器生成的元素的name属性,你很可能会看到它的读取

  

对于这些中的每一个。 甚至可以说name="contact_Name"

这是框架的一个严重缺点,它的解决方法通常是制作一个完整的自定义帮助程序或使用前端解决方案来修复名称。

名称必须与模型完全匹配。 你的价值观应该是什么

   etc.. 

因此我建议找出一种适用于当前项目的方法,以确保正确设置这些名称。

你在调用它之前不检查vwbooking.traces == null。 虽然您可能期望.ToList()可以保护您免受此影响,但Entity Framework可能很古怪(轶事)。 保护您的电话

 if (ModelState.IsValid) { db.bookings.Attach(vwbooking.bookings); db.Entry(vwbooking.bookings).State = EntityState.Modified; if(vwbooking.traces != null) { vwbooking.traces.ToList().ForEach( //THE ERROR OCCURS HERE t => { db.traces.Attach(t); db.Entry(t).State = EntityState.Modified; } ); db.SaveChanges(); } } 

你会没事的