0

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 是空的帖子列表。

笔记:

  1. 如果映射器忽略 Condition,则 blog.Posts 将为空,但它们为空。
  2. 当我在 opt.Condition 中设置断点并检查参数“b”(即博客)时,帖子已经为空。

有人知道为什么或如何达到预期的结果吗?

4

0 回答 0