Entity Framework Code First 5 Каскадное удаление ошибки во многих таблицах

ве эту модель

public class State
{
    public State()
    {
        this.Promotions = new List();
        this.Branches = new List();
        this.Stores = new List();
    }

    public int Id { get; set; }
    public string Description { get; set; }

    public virtual ICollection Promotions { get; set; }
    public virtual ICollection Stores { get; set; }
    public virtual ICollection Branches { get; set; }
}

public class Store
{
    public Store()
    {
        this.Promotions = new List();
        this.Branches = new List();
    }

    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection Promotions { get; set; }
    public virtual ICollection Branches { get; set; }

    public int StateId { get; set; } // Foreign key
    public virtual State State { get; set; } // Navigation Property
}

public class Branch
{
    public Branch()
    {
        this.Promotions = new List();
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public int StoreId { get; set; } // Foreign key
    public int StateId { get; set; } // Foreign key

    public virtual Store Store { get; set; } // Navigation Property
    public virtual State State { get; set; } // Navigation Property

    public virtual ICollection Promotions { get; set; }
}

    public class Promotion
{
    public Promotion()
    {
        this.Stores = new List();
        this.Branches = new List();
        this.Productos = new List();
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public int StateId { get; set; }

    public virtual ICollection Stores { get; set; }
    public virtual ICollection Branches { get; set; }
    public virtual ICollection Products { get; set; }

    public virtual State State { get; set; }

}

И это в моем контексте:

// State
modelBuilder.Entity()
    .HasMany(p => p.Promotions)
    .WithRequired(e => e.State)
    .WillCascadeOnDelete(false);

modelBuilder.Entity()
    .HasMany(s => s.Branches)
    .WithRequired(e => e.State)
    .WillCascadeOnDelete(false);

modelBuilder.Entity()
   .HasMany(e => e.Stores)
   .WithRequired(e => e.State)
   .WillCascadeOnDelete(true);

 // Store
modelBuilder.Entity()
    .HasMany(b => b.Branches)
    .WithRequired(s => s.Store)
    .WillCascadeOnDelete(true);

// Many to many
modelBuilder.Entity().
  HasMany(p => p.Promotions).
  WithMany(s => s.Stores).
  Map(
   m =>
   {
       m.MapLeftKey("StoreId");
       m.MapRightKey("PromotionId");
       m.ToTable("Store_Promotion");
   });

modelBuilder.Entity().
 HasMany(e => e.Products).
 WithMany(p => p.Promotiones).
 Map(
  m =>
  {
      m.MapLeftKey("PromotionId");
      m.MapRightKey("ProductoId");
      m.ToTable("Promotion_Producto");
  });

modelBuilder.Entity().
 HasMany(p => p.Promotiones).
 WithMany(b => b.Branches).
 Map(
  m =>
  {
      m.MapLeftKey("BranchId");
      m.MapRightKey("PromotionId");
      m.ToTable("Branch_Promotion");
  });

Теперь, если я включаю более одного WillCascadeOnDelete состояния (первые три в текущем отображении), я получаю ошибку

Метод тестирования Proj.Data.Tests.UnitTest1.TestPromotion выдает исключение:

System.Data.SqlClient.SqlException: введение ограничения FOREIGN KEY 'FK_dbo.Branch_dbo.Store_StoreId» на столе 'Ветка' может вызвать циклы или несколько каскадных путей. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION, либо измените другие ограничения FOREIGN KEY. Не удалось создать ограничение. Смотрите предыдущие ошибки.

Я знаю это, и япрочитал от Джули Лерманкнига s:

Некоторые базы данных (включая SQL Server) неt поддерживает несколько отношений, которые указывают каскадное удаление, указывающее на одну и ту же таблицу

Как это происходит, поскольку таблица отношений «многие ко многим» имеет каскадное удаление из обеих связанных таблиц.

Итак, мой вопрос: единственный выбор здесь - это отключить каскадное удаление в родительских таблицах и обработать удаление в таблице отношений вручную? Isn»Есть ли обходной путь от Entity Framework 5 для этого?

Ответы на вопрос(1)

Ваш ответ на вопрос