实体创建抛出“没有为此对象定义的无参数构造函数”

时间:2014-08-17 13:11:16

标签: asp.net-mvc entity-framework ef-code-first domain-driven-design

我正在处理基本的MVC5 / EF6应用程序,并遇到以下错误:

No parameterless constructor defined for this object.

当我使用创建新Controller时由Visual Studio 2013搭建的默认创建操作和视图时会发生这种情况。我没有在这些生成的文件中调整任何内容(TestItemControllerViews/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);
    }
}

1 个答案:

答案 0 :(得分:3)

当然,EF可以使用受保护的构造函数,但是scaffolding会创建用于创建新项目的操作方法。这些操作方法需要无参数的 public 构造函数。

您可以找到这些创建方法的一些详细信息here