2017-01-25 126 views
3

我创建了一个映射到视图模型集合映射到另一个集合上,这似乎没有问题的工作模型。映射后,模型的子对象具有适当的更新。如何更新与嵌套实体的实体与AutoMapper和保存更新的实体与实体框架?

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

然而,在保存时引发的错误:

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

我发现的是ChangeTracker.Entries()有一个状态为“Added”的额外项目。例如,我的Model.ChildCollection的计数为2,但在Entries()中,我有来自ChildCollection的状态为“Modified”的原始2个项目,以及与“Added”状态相同的项目中的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)); 
} 
+0

难道我的回答帮助你吗? – Seany84

回答

1

实体框架6

断开连接的数据是,先实体框架 和,对于这个问题,大多数的数据访问工具,一个老问题。它从来都不是一个简单的 解决。服务器发送数据沿着电线,不知道什么 可能发生在它请求它,甚至不知道 是否会返回客户端应用程序。然后,突然间,一些数据再次出现在请求中。 但它是相同的数据?它在什么时候缺什么? 是否发生了什么?这是完全新的数据吗?这么多担心 !

来源:https://stackoverflow.com/a/21436713/550198

实体框架的核心/实体框架7

实体框架的核心也被称为:本网站上提及上述文章https://msdn.microsoft.com/da-dk/magazine/mt694083

一个很好的反响EF7具有新功能,可以让您走过对象图。例如

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