繁体   English   中英

EF将孩子插入特定的父母

[英]EF Insert Child to specific Parent

我到处搜寻,发现许多问题,但没有一个回答我。

我想做的事情很简单,假设我们有这样的事情:

public class Parent
{
    public int ID { get; set; }

    public List<Child> Children { get; set; }
}

public class Child
{
    public int ID { get; set; }

    public int ParentID { get; set; }
    public Parent Parent { get; set; }
}

EF负责创建数据库,并通过脚手架获得控制器和视图。 一切正常,我可以创建Parent。 我也可以使用从下拉列表中选择的ParentID创建Child。

我真正想做的是删除下拉列表,然后将ParentID作为参数传递:

    public IActionResult Create(int id)
    {
        if (id == 0)
        {
            return NotFound();
        }

        ViewData["ID"] = id; //that a ParentID
        return View();
    }

鉴于我们得到了这个:

<form asp-action="Create">
    <div class="form-horizontal">
        <h4>Child</h4>
        <hr />
        <div asp-validation-summary="ModelOnly" class="text-danger"></div>
        <input type="hidden" asp-for="ParentID" value=@ViewData["ID"] />
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
</form>

提交此消息时,出现“当IDENTITY_INSERT设置为OFF时,无法为表'Children'中的Identity列插入显式值”。 现在我环顾四周,尝试了各种属性,但仍然无法正常工作。

我将不胜感激。


更新资料

从控制器创建方法:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Create([Bind("ID,ParentID")] Child child)
    {
        if (ModelState.IsValid)
        {
            _context.Add(child);
            await _context.SaveChangesAsync();
            return RedirectToAction("Index");
        }
        return View(book);
    }

只是为了显示更多有关问题的信息。 在这里,我使用默认的脚手架版本,并带有选择控件。

    public IActionResult Create(int id)
    {
        if (id == 0)
        {
            return NotFound();
        }

        ViewData["ParentID"] = new SelectList(_context.Parents.Where(x => x.ID == 1), "ID", "ID"); //Works
        ViewData["ParentID"] = new SelectList(_context.Parents.Where(x => x.ID == id), "ID", "ID"); // Doesn't work
        return View();
    }

在评论中与人交谈之后,我开始认为问题是由EF Core中的错误引起的,但我认为我发现“脏”的解决方法。

这是子模型:

public class Child
{
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int ID { get; set; }

    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int ParentID { get; set; }
    [ForeignKey("ParentID")]
    public Parent Parent { get; set; }
}

现在(由于某种原因)解决了“当IDENTITY_INSERT设置为OFF时,无法在表'Children'中为Identity列插入显式值”。 问题,但创建了新的,我们没有唯一的ID。 我通过自己修复此问题,这是create方法:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Create([Bind("ID,ParentID")] Child child)
    {
        if (ModelState.IsValid)
        {
            int _id;
            do
            {
                _id = new Random().Next();
            } while (await _context.Children.Where(b => b.ID == _id).AnyAsync());

            child.ID = _id;
            _context.Add(child);
            await _context.SaveChangesAsync();
            return RedirectToAction("Index");
        }
        ViewData["ID"] = id;
        return View(child);
    }

现在,doWhile确保我们不会将相同的ID分配给两个不同的对象。 随机选项的替代方法是使用Guid(当id为字符串时)或GetHashCode(并在发生冲突的情况下递增)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM