Entity Framework сущность с двумя свойствами одного типа с каскадным удалением

#c# #entity-framework #database-design #entity-framework-6 #ef-fluent-api

Вопрос:

Я нахожусь в ситуации, когда у меня есть организация, у которой есть два дополнительных адреса (адрес и почтовый адрес). Я хочу иметь возможность удалять их (каскадное удаление) при удалении организации.

Я хочу «попробовать» придерживаться этой настройки, потому что от этого зависит большая кодовая база (а не тестовая настройка, показанная ниже).

Организация:

     public class Organization
    {
        [Key]
        public int organizationId { get; set; }
        public string Title { get; set; }

        //public int? addressId { get; set; }
        public virtual Address address { get; set; }
       // public int? postalAddressId { get; set; }
        public virtual Address postalAddress { get; set; }
    }
 

Адрес:

     public class Address
    {
        [Key]
        public int addressId { get; set; }
        public string Title { get; set; }
    }
 

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

Вводится ограничение ВНЕШНЕГО КЛЮЧА ‘FK_dbo.Addresses_dbo.Organizations_postalAddress_organizationId в таблице «Адреса» может привести к циклам или нескольким каскадным путям. Укажите ПРИ УДАЛЕНИИ БЕЗ ДЕЙСТВИЯ или ПРИ ОБНОВЛЕНИИ БЕЗ ДЕЙСТВИЯ или измените другие ограничения ВНЕШНЕГО КЛЮЧА. Не удалось создать ограничение или индекс. См.Предыдущие ошибки.

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

Моя первоначальная миграция:

         public override void Up()
        {
            CreateTable(
                "dbo.Addresses",
                c => new
                    {
                        addressId = c.Int(nullable: false, identity: true),
                        Title = c.String(),
                        Organization_organizationId = c.Int(),
                    })
                .PrimaryKey(t => t.addressId)
                .ForeignKey("dbo.Organizations", t => t.Organization_organizationId, cascadeDelete: true)
                .Index(t => t.Organization_organizationId);
            
            CreateTable(
                "dbo.Organizations",
                c => new
                    {
                        organizationId = c.Int(nullable: false, identity: true),
                        Title = c.String(),
                        addressId = c.Int(),
                    })
                .PrimaryKey(t => t.organizationId);
            
        }
        
        public override void Down()
        {
            DropForeignKey("dbo.Addresses", "Organization_organizationId", "dbo.Organizations");
            DropIndex("dbo.Addresses", new[] { "Organization_organizationId" });
            DropTable("dbo.Organizations");
            DropTable("dbo.Addresses");
        }
 

ModelBuilder:

         public DbSet<Organization> organizations { get; set; }
        public DbSet<Address> Addresses { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Organization>()
               .HasOptional(a => a.address)
               .WithOptionalPrincipal()
               .WillCascadeOnDelete(true);

            modelBuilder.Entity<Organization>()
               .HasOptional(a => a.postalAddress)
               .WithOptionalPrincipal()
               .Map(m => m.MapKey("postalAddress_organizationId"))
               .WillCascadeOnDelete(true);
        }
 

and my last migration based on the modelBuilder:

         public override void Up()
        {
            AddColumn("dbo.Addresses", "postalAddress_organizationId", c => c.Int());
            AddColumn("dbo.Organizations", "postalAddressId", c => c.Int());
            CreateIndex("dbo.Addresses", "postalAddress_organizationId");
            AddForeignKey("dbo.Addresses", "postalAddress_organizationId", "dbo.Organizations", "organizationId", cascadeDelete: true);
        }
        
        public override void Down()
        {
            DropForeignKey("dbo.Addresses", "postalAddress_organizationId", "dbo.Organizations");
            DropIndex("dbo.Addresses", new[] { "postalAddress_organizationId" });
            DropColumn("dbo.Organizations", "postalAddressId");
            DropColumn("dbo.Addresses", "postalAddress_organizationId");
        }
 

заранее спасибо!