Полиморфизм против введения ограничения 'FOREIGN KEY' 'в таблице' UsageSummaries 'может вызвать циклы или несколько каскадных путей - PullRequest
0 голосов
/ 10 июня 2018

У меня есть следующий набор сущностей (пример кода упрощен, я оставил только ключевые и навигационные свойства ниже и удалил все свойства хранения данных)

public class Program
{
    public int Id {get;set;}

    public virtual ICollection<ProgramUsageSummary> UsageSummaries { get; set; } = new List<ProgramUsageSummary>();
    public virtual ICollection<Function> Functions { get; set; } = new List<Function>();
}

public class Function
{
        public int Id {get;set;}

        public virtual ICollection<FunctionUsageSummary> UsageSummaries { get; set; } = new List<FunctionUsageSummary>();
}

public class ProgramUsageSummary : UsageSummary
{
    public int ProgramId { get; set; }
    public Program Program { get; set; }

    public virtual ICollection<UsageDetail> UsageDetails { get; set; } = new List<UsageDetail>();
}

public class FunctionUsageSummary : UsageSummary
{
        public int FunctionId { get; set; }
        public Function Function { get; set; }

        public virtual ICollection<UsageDetail> UsageDetails { get; set; } = new List<UsageDetail>();
}

public class UsageDetail
{
        public int Id { get; set; }
        public virtual UsageSummary UsageSummary { get; set; }
        public int UsageSummaryId { get; set; }
}

public abstract class UsageSummary
{
    public int Id { get; set;}
}

A Program может иметь ноль илимного ProgramUsageSummaries.

Каждый из ProgramUsageSummaries может иметь один или несколько UsageDetails.

A Program также может иметь ноль или несколько Functions, каждый из которых может иметь ноль или несколько FunctionUsageSummaries, и каждый из них будет иметь один или несколько UsageDetails.

При такой настройке я получаю следующую ошибку:

Введение ограничения FOREIGN KEY 'FK_dbo.UsageSummaries_dbo.Programs_ProgramId' в таблице 'UsageSummaries' может вызвать циклы или несколько каскадных путей.Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION, или измените другие ограничения FOREIGN KEY

Как сохранить полиморфный дизайн (из UsageSummary) и избавиться от этой ошибки?

1 Ответ

0 голосов
/ 10 июня 2018

Самым простым изменением является настройка DbContext, чтобы не каскадно удалял на множественных путях доступа.Вам нужно просто обработать их в коде, например, удалить FuntionSummaries в перед удалением функции и т. Д.

Другой способ - удалить абстрактный базовый класс UsageSummary из вашего DbContext.Тогда сопоставление базы данных для различных подтипов UsageSummary будет состоять из отдельных и не связанных таблиц.

...