#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");
}
заранее спасибо!