【问题标题】:Delete Owned Entities 2 level depth using GraphDiff使用 GraphDiff 删除拥有的实体 2 级深度
【发布时间】:2016-08-25 11:33:11
【问题描述】:

我首先在我的 MVC 项目中使用实体框架代码(版本 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,其中有许多CommunicationTopics 和他们的ContributingMembers 并保存聚合根CommunicationPlan,那么 GraphDiff 将创建所有记录并将它们关联到数据库中。 (正如我想要的那样)

问题
当我试图从现有的CommunicationPlan 中删除其中一个CommunicationTopic 时,这个主题会从数据库中删除(根据我的需要),但是与CommunicationTopic 相关的ContributingMembers 不会被删除from database ,只是它们的外键值设置为空,并且它们驻留在数据库中。

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

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

问题如何配置实体以使 GraphDiff 在其父 -CommunicationTopic- 删除时删除 ContributingMembers 记录?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢先生,这解决了我的问题。我只是忘了设置ContributingMember的外键值等于0,所以当用外键0更新数据库时,我收到了更新冲突异常
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 2013-03-23
    • 2018-03-17
    • 1970-01-01
    相关资源
    最近更新 更多