AutoMapper 从 EF 核心代理实体的 ICollection 属性中删除所有元素。
重现代码:
private static void Main(string[] args)
{
// Initializa database
var dbContext = new DatabaseContext();
dbContext.ClearAll<Blog>();
// Initialize mapper
var mapper = new MapperConfiguration(cfg =>
{
cfg.CreateMap<BlogDto, Blog>().ForMember(b => b.Posts, opt => opt.Condition((bDto, b) => bDto.Posts != null));
cfg.CreateMap<PostDto, Post>();
}).CreateMapper();
// Initialize seed data
var blog = new Blog
{
Description = "Blog description",
Posts = new[]
{
new Post
{
Text = "Testing text 1",
},
new Post
{
Text = "Testing text 2",
},
},
};
// Add blog
blog = dbContext.Add(blog).Entity;
dbContext.SaveChanges();
// Detach and find again to get proxy of blog
dbContext.Entry(blog).State = EntityState.Detached;
blog = dbContext.Find<Blog>(blog.Id);
// Update
var blogDtoForUpdate = new BlogDto
{
Description = "Updated blog description",
Posts = null,
};
// After this line the blog will have empty Posts (not null).
mapper.Map(blogDtoForUpdate, blog);
}
预期结果: blog.Description 更新为新值,并且 blog.Posts 与映射前相同。
实际结果: blog.Description 已正确更新,但 blog.Posts 是空的帖子列表。
笔记:
- 如果映射器忽略 Condition,则 blog.Posts 将为空,但它们为空。
- 当我在 opt.Condition 中设置断点并检查参数“b”(即博客)时,帖子已经为空。
有人知道为什么或如何达到预期的结果吗?