我正在处理基本的MVC5 / EF6应用程序,并遇到以下错误:
No parameterless constructor defined for this object.
当我使用创建新Controller时由Visual Studio 2013搭建的默认创建操作和视图时会发生这种情况。我没有在这些生成的文件中调整任何内容(TestItemController
,Views/TestItem/Create.cshtml
)。我的控制器是脚手架的实体看起来像这样:
public class TestItem
{
private Category _category;
// Primary key
public int TestItemId { get; set; }
public int CategoryId { get; set; }
public string TestColumn { get; set; }
public virtual Category Category {
get { return _category; }
set { _category = value; }
}
protected TestItem()
{
}
public TestItem(Category category)
{
_category = category;
}
}
public class Category
{
private ICollection<TestItem> _testItems;
// Primary key
public int CategoryId { get; set; }
public string Description { get; set; }
public virtual ICollection<TestItem> TestItems
{
get { return _faqs; }
set { _faqs = value; }
}
public Category()
{
_testItems = new List<TestItem>();
}
}
我猜测这是因为TestItem类让构造函数接受了一个Category对象,这就是为了让域模型保持贫血。如果没有类别,则无法创建TestItem。但据我所知,在延迟加载等的情况下,EF应该使用受保护的无参数构造函数。
这里发生了什么,或者我做错了什么?
更新 控制器看起来像这样(修剪):
public class TestItemsController : Controller
{
public ActionResult Create()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Create([Bind(Include = "TestItemId,OtherColumns")] TestItem testItem)
{
if (ModelState.IsValid)
{
db.TestItems.Add(testItem);
await db.SaveChangesAsync();
return RedirectToAction("Index");
}
return View(testItem);
}
}
答案 0 :(得分:3)
当然,EF可以使用受保护的构造函数,但是scaffolding会创建用于创建新项目的操作方法。这些操作方法需要无参数的 public 构造函数。
您可以找到这些创建方法的一些详细信息here。