【发布时间】:2020-05-15 18:36:54
【问题描述】:
就像标题所说:我的 .SaveChanges() 方法正在尝试再次插入我的属性 (ParameterType),这不应该是这种情况。当用户从 Dropdownlistfor 中选择不同的项目时,该属性应该只更新。无论您保留旧的 ParameterType 还是在 Edit 视图中选择不同的,编译器都会 10/10 抛出此错误。
我有一个 ASP.NET Core 应用程序并使用 Entity Framework Core 我有这样的设置:
型号
public class Parameter
{
public int ParameterId { get; set; }
public string Name { get; set; }
public string Value{ get; set; }
public ParameterType ParameterType { get; set; }
}
查看(编辑)
<form method="post">
<div class="row">
<div class="col-md-6">
<div asp-validation-summary="All" class="text-danger"></div>
<div class="form-group">
<label>Name</label>
<input asp-for="Name" class="form-control" required />
<label>Value</label>
<textarea asp-for="Value" class="form-control" required style="width:1250px"> </textarea>
<label>ParameterType</label>
@Html.DropDownListFor(m => m.ParameterType.ParameterTypeId, new SelectList(Model.ParameterTypes, "ParameterTypeId", "TypeName"), new { @class = "form-control" })
</div>
</div>
</div>
<div class="row">
<div class="col-md-1 col-md-offset-10">
<button class="btn btn-primary" type="submit">Confirm</button>
</div>
<div class="col-md-1">
<a asp-controller="Parameter" asp-action="Index" class="btn btn-default">Cancel</a>
</div>
</div>
</form>
将 EVM 映射到模型的函数
[HttpPost]
public IActionResult Edit(ParameterEditViewModel parameterEditViewModel, int id)
{
Parameter parameter = null;
parameter = _parameterRepository.GeefParameterMetId(id);
MapParameterEditViewModelToParameter(parameterEditViewModel, parameter);
try
{
_parameterRepository.SaveChanges();
}
catch
{
TempData["error"] = $"Edit failure";
}
TempData["message"] = $"Parameter Edit success";
return RedirectToAction(nameof(Index));
}
SaveChanges() 抛出此异常:
The instance of entity type 'ParameterType' cannot be tracked because another instance with the same key value for {'ParameterTypeId'} is already being tracked. When attaching existing entities, ensure that only one entity instance with a given key value is attached. Consider using 'DbContextOptionsBuilder.EnableSensitiveDataLogging' to see the conflicting key values.
更新:MapParameterEditViewModelToParameter 方法
private void MapParameterEditViewModelToParameter(ParameterEditViewModel parameterEditViewModel, Parameter parameter)
{
parameter.Name= parameterEditViewModel.Naam;
parameter.Value= parameterEditViewModel.Waarde;
parameter.ParameterType = parameterEditViewModel.ParameterType;
}
亲切的问候, 格兰尼
【问题讨论】:
-
你也可以分享你的
MapParameterEditViewModelToParameter方法吗? -
很抱歉,我一开始忘了做这个,完成了:)
标签: c# asp.net-core model-view-controller entity-framework-core