EF将子项插入特定父项

时间:2016-09-08 16:57:03

标签: c# entity-framework asp.net-core entity-framework-core identity-insert

我一直在寻找各地,发现了许多问题,但他们都没有回答我。

我想做的事情很简单,假设我们有类似的东西:

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);
    }

只是为了更多地了解问题。在这里,我使用默认的scaffolded版本,并在视图中选择控件。

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

1 个答案:

答案 0 :(得分:0)

在评论中与人交谈后,我开始认为这个问题是由EF Core中的一个错误导致的,但我认为我发现了这个问题很糟糕&#39;解决。

这是儿童模特:

arguments

现在(出于某种原因)这解决了&#34;无法在表格中插入标识列的显式值&#39;儿童&#39;当IDENTITY_INSERT设置为OFF时。&#34;问题,但创造新的,我们没有得到唯一的ID。我通过自己制作来修复它,这里是创建方法:

protected void updateFreqCountForText(Map<String, Integer> wordFreq, String line) {
            ConcurrentMap<String, Integer> wordFreqConc = (ConcurrentMap<String, Integer>) wordFreq;
            Pattern pattern = Pattern.compile("[a-zA-Z]+");
            Matcher matcher  = pattern.matcher(line);
            while (matcher.find()) {
                String word = matcher.group().toLowerCase();
                Integer oldCount;

                oldCount = wordFreqConc.get(word);
                if (oldCount == null) {
                    oldCount = wordFreqConc.putIfAbsent(word, 1);
                    if (oldCount == null)
                        continue;
                    else wordFreqConc.put(word, oldCount + 1);
                }
                else
                    do {
                        oldCount = wordFreqConc.get(word);
                    } while (!wordFreqConc.replace(word, oldCount, oldCount + 1));

            }
        }

现在doWhile确保我们不会将相同的id分配给两个不同的对象。 Random选项的替代方法是使用Guid(当id是字符串时)或GetHashCode(并且在发生碰撞时可以增加)。

相关问题