C# 从DTO自动映射到实体模型时处理未更改/不相关的关系

C# 从DTO自动映射到实体模型时处理未更改/不相关的关系,c#,asp.net-mvc,entity-framework,automapper,dto,C#,Asp.net Mvc,Entity Framework,Automapper,Dto,我在尝试更新一个实体时遇到了一个恼人的问题,该实体与前端中我不关心的关系有关。 问题是,当automapper创建我的项时,默认构造函数将关系设置为空列表(应为null),这在EF尝试保存它时会导致问题,因为现在它认为应该删除现有实体具有的关系 我认为这是很多人都遇到过的问题,但谷歌似乎并不这么认为。我是不是用错误的方式来处理这个问题?从DTO映射到实体模型时,如何维护实体关系 课程 // normal code first POCO class public class Item {

我在尝试更新一个实体时遇到了一个恼人的问题,该实体与前端中我不关心的关系有关。 问题是,当automapper创建我的项时,默认构造函数将关系设置为空列表(应为null),这在EF尝试保存它时会导致问题,因为现在它认为应该删除现有实体具有的关系

我认为这是很多人都遇到过的问题,但谷歌似乎并不这么认为。我是不是用错误的方式来处理这个问题?从DTO映射到实体模型时,如何维护实体关系

课程

// normal code first POCO class
public class Item
{
    public Item()
    {
        Others = new List<Other>();
    }

    public int Id {get; set;}
    public virtual ICollection<Other> Others {get; set;}
}

// my DTO
public class ItemDTO
{
    public int Id {get; set;}
}
//普通代码第一个POCO类
公共类项目
{
公共项目()
{
其他=新列表();
}
公共int Id{get;set;}
公共虚拟ICollection其他{get;set;}
}
//我的DTO
公共类ItemDTO
{
公共int Id{get;set;}
}
控制器动作

[HttpPost]
public void PostAction(ItemDTO dto)
{
    var item = Mapper.Map<Item>(dto);
    // The problem here is that item.Others.Count is 0, should be null
    // so EF thinks it needs to delete the relationships
    _repo.Update(item);
}
[HttpPost]
公开作废邮递(从ItemDTO到dto)
{
var item=Mapper.Map(dto);
//这里的问题是item.Others.Count为0,应该为null
//因此EF认为需要删除这些关系
_回购更新(项目);
}

有两种方法可以做到这一点:

您可以在AutoMapper映射关系后将其设置为
null

[HttpPost]
public void PostAction(ItemDTO dto)
{
    var poco = Mapper.Map<Item>(dto);
    poco.Others = null;
    _repo.Update(poco);
}
[HttpPost]
公开作废邮递(从ItemDTO到dto)
{
var poco=Mapper.Map(dto);
poco.Others=null;
_回购更新(poco);
}
或者,您可以创建一个始终将其设置为空的自定义automapper配置文件:

public class ItemMap : Profile
{
    protected override void Configure()
    {
        CreateMap<Item, Listing>().ForMember(d => d.Others, o => o.UseValue(null));
    }
}
public类ItemMap:Profile
{
受保护的覆盖无效配置()
{
CreateMap().formMember(d=>d.Others,o=>o.UseValue(null));
}
}

如果那是你唯一想要的地方,你会使用第一种方法。如果总是这样的话,请使用第二种方法

而不是创建配置文件,为什么不在映射配置本身中将属性设置为null呢?有时简单的解决方案是最好的:)我想可能在某个地方有一些设置。