如果其中一个导航属性为null,则无法删除关系记录

时间:2015-10-01 18:34:38

标签: c# entity-framework automapper

我有以下模型ProgramGroup,以及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来强调GroupProgramGroup之间的关系。

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会删除关系实体。

1 个答案:

答案 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));