我一直在尝试更新一个具有子实体列表的实体,但是由于某种原因,我一直遇到相同的错误,而且我不知道自己在做什么错。任何帮助将不胜感激。错误是:
操作失败:无法更改关系,因为 一个或多个外键属性不可为空。当一个 更改关系后,相关外键属性为 设置为空值。如果外键不支持空值, 必须定义新的关系,外键属性必须为 分配另一个非空值,否则不相关的对象必须是 删除。
兄弟,我正在尝试:
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;
}
答案 0 :(得分:0)
由于过去与此类似的问题以及延迟加载触发器,我没有将Automapper与EF一起使用,但是最近我一直在深入研究它,因为它似乎具有更好的IQueryable支持。我不确定情况是否仍然如此,但是Automapper有一个限制,即默认情况下将替换映射的子集合,并且使用EF可以将其视为标记为要插入的新实体或现有的子实体被“淘汰”。父项和EF标记不能将其FK清空。解决方案是告诉Automapper保留目标集合,然后分别处理这些映射。 (使用子映射),可能需要一些额外的工作来处理修改后的集合中的插入和删除操作。
可能有帮助的事情: http://bzbetty.blogspot.com/2012/06/updating-collections-using-automapper.html