在WebAPI MVC项目中,我有一个名为ServiceKey
的EF对象。它只是几列。
VS支架/生成带视图的MVC 5控制器(使用EF)。它创造了我需要的所有方法。创建,编辑,删除等。要清楚,这是开箱即用的#34;控制器和视图。使用预生成的Create函数会生成null参数。这是它生成的代码:
// POST: ServiceKeys/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Create([Bind(Include = "id,serviceKey,consumer,created,modified,deleted,deletedDate")] ServiceKey serviceKey)
{
if (ModelState.IsValid)
{
db.ServiceKeys.Add(serviceKey); //throws exception here
await db.SaveChangesAsync();
return RedirectToAction("Index");
}
return View(serviceKey);
}
serviceKey
为空,因此EF会抛出错误,指出该实体不能为空:
Value cannot be null.
Parameter name: entity
可以肯定的是,这是我的路线:
Web API路线:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
RouteConfig:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
为什么这个开箱即用失败?
答案 0 :(得分:0)
叹息
因为很明显,如果你的列名与表名相同,那么EF和MVC会混淆哪一个是哪一个。
在这个特定的例子中,表的名称与列相同,因为这是一个测试,当我扩展db上下文时,serviceKey guid是自动生成的,它没有被填写在表单中。
因此,它认为model.serviceKey列实际上是ServiceKey 对象,并且因为它是null,所以它变得很糟糕。
微软的快速拍手
答案 1 :(得分:0)
只需将 ServiceKey
实例名称从 serviceKey
更改为 seviceKeyObj
或其他内容,问题将得到解决。实例名应该与其类名不同。