【问题标题】:Why is Entity Framework trying to store my foreign key for a second time?为什么实体框架第二次尝试存储我的外键?
【发布时间】: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


【解决方案1】:

您必须像这样扩展您的 Parameter 类:

public class Parameter
    {
        public int ParameterId { get; set; }

        public string Name { get; set; }
        public string Value{ get; set; }
        public int ParameterTypeId { get; set; } // FK to parameter type
        public ParameterType  ParameterType { get; set; }

 }

然后调整绑定:


        private void MapParameterEditViewModelToParameter(ParameterEditViewModel parameterEditViewModel, Parameter parameter)
        {
            parameter.Name= parameterEditViewModel.Naam;
            parameter.Value= parameterEditViewModel.Waarde;
            parameter.ParameterTypeId = parameterEditViewModel.ParameterTypeId; // also change this property name and type to just carry only the Id of parameter type
        }

【讨论】:

  • 谢谢!这是有道理的,我想我只是忽略了这一点:-)
  • 没问题,如果它对你有用,你能接受这个答案,所以很明显不需要解决方案了吗?:p
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-11
  • 1970-01-01
  • 2012-11-10
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
相关资源
最近更新 更多