我一直在寻找各地,发现了许多问题,但他们都没有回答我。
我想做的事情很简单,假设我们有类似的东西:
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();
}
答案 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(并且在发生碰撞时可以增加)。