0

我一直在到处寻找,发现了很多问题,但他们都没有回答我的问题。

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

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 负责创建数据库并通过脚手架获得控制器和视图。一切正常,我可以创建父级。我还可以使用从下拉列表中选择的 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' 中插入标识列的显式值。” 现在我到处查看并尝试了各种属性,但我仍然无法让它工作。

我将不胜感激任何形式的帮助。


更新

从控制器创建方法:

    [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();
    }
4

1 回答 1

0

在与评论中的人交谈后,我开始认为问题是由 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' 中插入标识列的显式值”。问题但创建新的,我们没有得到唯一的ID。我通过自己制作解决了这个问题,这里是创建方法:

    [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 分配给两个不同的对象。Random 选项的替代方案是使用 Guid(当 id 是字符串时)或 GetHashCode(并且可能在发生冲突的情况下增加)。

于 2016-09-10T11:57:36.473 回答