При создании объекта выдается "Конструктор без параметров для этого объекта"

Я работаю над базовым приложением MVC5/EF6 и сталкиваюсь со следующей ошибкой:

No parameterless constructor defined for this object.

Это происходит, когда я использую действие по умолчанию "Создать" и "Просмотр", которые создаются в 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);
    }
}

1 ответ

Решение

Конечно, EF может использовать защищенные конструкторы, но скаффолдинг создает методы действий для создания нового элемента. Эти методы действия требуют открытого конструктора без параметров.

Вы можете найти некоторые детали этих методов создания здесь.

Другие вопросы по тегам