簡體   English   中英

實體創建拋出“沒有為此對象定義的無參數構造函數”

[英]Entity creation throws “No parameterless constructor defined for this object”

我正在研究基本的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);
    }
}

當然,EF可以使用受保護的構造函數,但是scaffolding會創建用於創建新項目的操作方法。 這些操作方法需要無參數的公共構造函數。

您可以在此處找到這些創建方法的一些詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM