使用GraphDiff删除拥有实体2级深度

时间:2016-08-25 11:33:12

标签: c# entity-framework ef-code-first graphdiff

我首先在我的MVC项目中使用Entity Framework代码(版本6)和GraphDiff。

这是一些映射数据库中某些表的实体。

public class CommunicationPlan 
{
    public int CommunicationPlanID { get; private set; }

    [Owned]
    public List<CommunicationTopic> Topics { get; private set; }
}

public class CommunicationTopic 
{
    public int CommunicationTopicID { get; private set; }

    [Owned]
    public List<ContributingMember> Members { get; private set; }
}

public class ContributingMember
{
    public int ContributingMemberID { get; private set; }

    // other simple properties
}

当我使用CommunicationPlan创建CommunicationTopicContributingMember并保存聚合根CommunicationPlan时,GraphDiff会创建所有记录并将它们关联起来在数据库中。 (正如我想的那样)

问题
当我尝试从现有CommunicationTopic中删除其中一个CommunicationPlan时,会从数据库中删除此主题(根据需要),但与ContributingMember相关的CommunicationTopic ContributingMember没有从数据库中删除,只是它们的外键值设置为null,它们驻留在数据库中。

当我配置ContributingMember的外键以使其不接受空值时,我收到以下异常

  

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

问题如何配置实体以使GraphDiff在其父级CommunicationTopic - 已删除时删除readFile(path.resolve("../../../../../log/serverError.log")) 的记录?

1 个答案:

答案 0 :(得分:1)

我认为您可能有两种方法来解决此问题

  1. 尝试将数据库中关系的级联属性配置为CommunicationTopic和ContributingMember之间的CASCADE DELETE
  2. 确保在尝试删除AggregateRoot时加载整个图表