automapper - 使用 Automapper.Collection.EntityFrameworkCore 的 EF Core 集合
问题描述
鉴于我有 2 个班级,Foo 和 Bar:
public class Foo
{
private readonly List<Bar> _bars = new List<Bar>();
public int Id { get; private set; }
public string Name { get; private set; }
public IEnumerable<Bar> Bars => _bars;
public void AddBar(Bar bar)
{
_bars.Add(bar);
}
public static Foo Create(string name)
{
return new Foo { Name = name };
}
private Foo() { }
}
public class Bar
{
public int Id { get; private set; }
public string Description { get; private set; }
public static Bar Create(string description)
{
return new Bar { Description = description };
}
}
有 2 个对应的 DTO,
public class BarDto
{
public int Id { get; set; }
public string Description { get; set; }
}
public class FooDto
{
public int Id { get; set; }
public string Name { get; set; }
public List<BarDto> Bars { get; set; }
public FooDto()
{
Bars = new List<BarDto>();
}
}
和 AutoMapper/AutoMapper.Collection.EntityFrameworkCore 设置
var config = new MapperConfiguration(cfg =>
{
cfg.AddCollectionMappers();
cfg.UseEntityFrameworkCoreModel<DemoContext>();
cfg.CreateMap<BarDto, Bar>().EqualityComparison((src, dest) => src.Id == dest.Id);
cfg.CreateMap<FooDto, Foo>().ForMember(dest => dest.Bars, opt =>
{
opt.MapFrom(s => s.Bars);
opt.UseDestinationValue();
}).EqualityComparison((src, dest) => src.Id == dest.Id);
});
我有一个用例,传入的 FooDto 可能包含 Bars 集合中的插入、附加、更新和删除的项目,我试图通过以下方式处理:
- 从数据库中查找现有实体
- 将 DTO 的更改映射到实体
- 将更改保存到数据库
但是,以下代码会产生一个InvalidOperationException
异常,指出“无法跟踪实体类型 'Bar' 的实例,因为已经在跟踪另一个具有键值 '{Id: 1}' 的实例。附加现有实体时,请确保只有一个实体附加了具有给定键值的实例“
var fooToUpdate = db.Foos.Include(_ => _.Bars).FirstOrDefault(_ => _.Id == fooDto.Id);
mapper.Map(fooDto, fooToUpdate);
db.SaveChanges();
我的理解是,因为我正在EqualityComparison
为BarDto -> Bar
映射设置它应该更新被跟踪的实体并且保存操作应该成功,因为它引用了同一个对象?
我不确定我是否以错误的方式进行此操作,或者只是在配置中遗漏了一些东西。
更新
看来我面临的问题可能与github上的这个问题有关。
解决方案
推荐阅读
- java - 在java而不是javascript中绘制html
- java - 我正在尝试将字符串字符插入另一个字符串。我怎样才能在java中实现它?
- html - 滚动位置属性
- spring-boot - Spring social Facebook 在 2.0.2 版本中不起作用
- python-3.x - 错误:找不到 Requirement.parse('pytest-runner') 的合适分布
- java - 弹簧形式:单选按钮在页面加载时选择了一个
- c# - 如何使用另一个类的列表视图数据?
- azure - 如何在 azure 门户网站中获取所有 Web 应用程序的 URL/URL 列表
- c++ - 为 c/c++ 函数调用设置超时
- javascript - D3非圆弧