【问题标题】:How do I update an entity with nested entities with AutoMapper and save the updated Entity with Entity Framework?如何使用 AutoMapper 更新具有嵌套实体的实体并使用 Entity Framework 保存更新的实体?
【发布时间】:2017-01-25 20:36:30
【问题描述】:

我创建了一个映射,将 ViewModel 中的集合映射到 Model 上的另一个集合,这似乎可以正常工作。映射后,Model的子对象有相应的更新。

configuration.CreateMap<SourceViewModel, Destination>()                
            .ForMember(d => d.ChildOfDestination, 
                      opt => opt.MapFrom(s => Mapper.Map<ICollection<SourceViewModel>, ICollection<Destination>>(s.ChildOfSource)));

但是,保存时会抛出错误:

操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。

我发现 ChangeTracker.Entries() 有额外的项目,状态为“已添加”。例如,我的 Model.ChildCollection 的计数为 2,但在 Entries() 中,我有来自 ChildCollection 的原始 2 项状态为“已修改”,而相同项目中的 2 项状态为“已添加”

public async Task<IHttpActionResult> Update([FromBody] SourceViewModel viewModel) {
    var model = await _repository.GetByIdAsync(viewModel.Id);
    Mapper.Map(viewModel, model);
    _repository.Update(model);
    await _unitOfWork.SaveAsync();
}

我暂时写了一些代码来解决这个问题,但这是对一个更大的问题的破解,我不知道如何解决。

foreach (var child in ViewModel.Child)
{
  var record = Model.Child.SingleOrDefault(c => c.ID == child.ID);

  if (record != null)
      Mapper.Map(child, record);
  else
      Model.Child.Add(Mapper.Map<SourceViewModel, Destination>(child));
}

【问题讨论】:

  • 我的回答对你有帮助吗?

标签: c# entity-framework automapper


【解决方案1】:

实体框架 6

断开数据是实体框架之前的一个老问题 并且,就此而言,大多数数据访问工具。这从来都不是一件容易的事 一要解决。服务器通过网络发送数据,不知道是什么 可能在请求它的客户端应用程序中发生,甚至不知道 如果它会回来。然后,突然,一些数据重新出现在请求中。 但它是相同的数据吗?在它缺席的情况下它在做什么?做过 有什么事吗?是全新的数据吗?太担心了 关于!

来源:https://msdn.microsoft.com/da-dk/magazine/mt694083

参考上面的文章在本站得到了很好的回应:https://stackoverflow.com/a/21436713/550198

Entity Framework Core / Entity Framework 7

Entity Framework Core 也称为 EF7,具有允许您遍历对象图的新功能。例如

context.ChangeTracker.TrackGraph(someEntity,  e => e.Entry.State = EntityState.Added);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-10
    • 2021-07-28
    • 1970-01-01
    • 2018-11-02
    • 2013-07-21
    • 2016-09-13
    • 2020-02-25
    • 2014-09-29
    相关资源
    最近更新 更多