EF问题添加带有子实体列表的实体

时间:2018-08-26 11:13:58

标签: c# entity-framework automapper

我一直在尝试更新一个具有子实体列表的实体,但是由于某种原因,我一直遇到相同的错误,而且我不知道自己在做什么错。任何帮助将不胜感激。错误是:

  

操作失败:无法更改关系,因为   一个或多个外键属性不可为空。当一个   更改关系后,相关外键属性为   设置为空值。如果外键不支持空值,   必须定义新的关系,外键属性必须为   分配另一个非空值,否则不相关的对象必须是   删除。

兄弟,我正在尝试:

public class Parent
{
    [Key]
    public int Id { get; set; }

    [MaxLength(25)]
    public string Name { get; set; }

    [MaxLength(25)]
    public string FullName { get; set; }

    public virtual ICollection<Child> ChildList { get; set; } = new HashSet<Child>();
}

public class Child
{
    [Key]
    public int Id { get; set; }

    [Required]
    [MaxLength(12)]
    public string Number { get; set; }

    [IgnoreMap]
    public Parent Parent { get; set; }

    public int ParentId { get; set; }
}

public async Task<Parent> UpdateParent(Parent Parent)
{
    Parent originalParent = await GetById(Parent.Id, c => c.ChildList);

    Mapper.Map(Parent, originalParent);
    await DbContext.SaveChangesAsync();

    return originalParent;
}

我还注意到,如果我不使用自动映射器,而只是手动映射属性,它将起作用:

private static void MapParentProperties(Parent parent, Parent originalParent)
{
    originalParent.Name = parent.Name;
    originalParent.FullName = parent.FullName;
}

1 个答案:

答案 0 :(得分:0)

由于过去与此类似的问题以及延迟加载触发器,我没有将Automapper与EF一起使用,但是最近我一直在深入研究它,因为它似乎具有更好的IQueryable支持。我不确定情况是否仍然如此,但是Automapper有一个限制,即默认情况下将替换映射的子集合,并且使用EF可以将其视为标记为要插入的新实体或现有的子实体被“淘汰”。父项和EF标记不能将其FK清空。解决方案是告诉Automapper保留目标集合,然后分别处理这些映射。 (使用子映射),可能需要一些额外的工作来处理修改后的集合中的插入和删除操作。

可能有帮助的事情: http://bzbetty.blogspot.com/2012/06/updating-collections-using-automapper.html