我有以下模型Program
和Group
,以及ProgramGroup
联结表关系实体:
public class Program
{
public int ProgramId { get; set; }
public int? ParentProgramId { get; set; }
public Program ParentProgram { get; set; }
public IList<ProgramGroup> ProgramGroups { get; set; }
}
public class Group
{
public int GroupId { get; set; }
public string Name { get; set; }
}
public class ProgramGroup
{
public int ProgramGroupId { get; set; }
public int ProgramId { get; set; }
public Program Program { get; set; }
public int GroupId { get; set; }
public Group Group { get; set; }
public string Pin { get; set; }
}
正如您所看到的,我实际上必须创建一个ProgramGroup
类,因为该关系具有行为(Pin
属性)。
以下代码应该通过删除Program
来强调Group
和ProgramGroup
之间的关系。
public void Delete(ProgramGroup programGroup)
{
context.ProgramGroups.Remove(programGroup);
}
在我的应用程序界面中更新程序并删除程序和组之间的关系时,我检索原始程序,确定是否删除了任何ProgramGroup
,然后调用{{ 1}}上面的方法。删除失败。
在我调试过程中,我注意到要删除的Delete
的{{1}}导航属性为null,而Program
导航属性不是空值。它为null,因为当我检索原始程序时,我在所有程序的ProgramGroup
上清空了Group
属性。我不得不这样做,因为我得到了一个自引用循环错误。当我删除使所有Program
的{{1}}属性为空的代码行时,要删除的ProgramGroup
上的Program
属性不为null并且执行删除成功。
当其中一个导航属性为null时,为什么EF会删除关系实体。
答案 0 :(得分:0)
事实证明,问题是由于必须将我的ProgramGroups的Program
属性归零。这是我为避免自我引用循环异常所做的事情,因为我从我的域实体转换为我的视图模型,这实际上是由AutoMapper引起的。 EF正确填充了我的对象的导航属性,AutoMapper自动无限地映射事物:
Program > ProgramGroup > Program > ProgramGroup > Program > ProgramGroup ...
这就是为什么我不得不将Program
归零。发生的事情是当我去删除一个ProgramGroup时,EF无法将它与现有的ProgramGroup匹配,因为Program属性为null并且它导致了问题。
不幸的是,我专注于EF是导致问题的原因,而不是AutoMapper。我只需要改变我的AutoMapper配置:
Mapper.CreateMap<ProgramGroup, ProgramGroupViewModel>();
为:
Mapper.CreateMap<ProgramGroup, ProgramGroupViewModel>()
.ForMember(m => m.Program, x => x.MapFrom(v => (Program)null));