0

Моего кода-первая модель Entity Framework выглядит следующим образом:Несколько каскадных пути Entity Framework

В моей базе данных у меня есть customers, purchases и items.

  • customer может иметь несколько purchases
  • Каждый purchase может состоять из нескольких purchased_item.
  • Каждый purchased_item ссылается на item.

Таким образом, при настройке своих объектов с FluentAPI у меня есть следующие конфигурации:

public class PurchaseConfiguration : EntityTypeConfiguration<Purchase> 
{ 
    public PurchaseConfiguration (string schema = "dbo") 
    { 
     ToTable(schema + ".Purchase"); 
     HasKey(p => p.PurchaseId); 
     Property(p => p.Name); 

     HasMany(p => p.PurchasedItems) //This is an ICollection of PurchaseItem in the Purchase class 
      .WithRequired(pi => pi.Purchase) 
      .HasForeignKey(pi => pi.PurchaseId) 
      .WillCascadeOnDelete(true); 
    } 
} 

public class ItemConfiguration : EntityTypeConfiguration<Item> 
{ 
    public ItemConfiguration (string schema = "dbo") 
    { 
     ToTable(schema + ".Item"); 
     HasKey(i => i.ItemId); 
     Property(i => i.Name); 

     HasMany(i => i.PurchasedItems) 
      .WithRequired(pi => pi.Item) 
      .HasForeignKey(pi => pi.ItemId) 
      .WillCascadeOnDelete(true); 
    } 
} 

public class PurchasedItemConfiguration : EntityTypeConfiguration<PurchasedItem> 
{ 
    public PurchasedItemConfiguration (string schema = "dbo") 
    { 
     ToTable(schema + ".PurchasedItem"); 
     HasKey(rp => rp.PurchasedItemId); 
    } 
} 

Как я хочу, чтобы это вести себя в том, что, когда вы стереть purchased item на БД никакой информации, связанной с либо purchase или item утерян. Однако, если item или purchase удаляется из db, то также удаляется purchaseditem.

Однако, когда я пытаюсь обновить свою базу данных, я получаю следующее исключение:

Вводя ограничение внешнего ключа «FK_dbo.PurchasedItem_dbo.Item_ItemId» на стол «PurchasedItem» может вызвать циклы или несколько путей порогов. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION или измените другие ограничения FOREIGN KEY.
Не удалось создать ограничение или индекс. См. Предыдущие ошибки.

+0

, которые должны работать ... у вас есть какие-либо другие отношения между тремя таблицами? – jjj

+0

Нет, я этого не делаю. Единственное другое отношение заключается в том, что «клиент» имеет каскадное удаление, установленное в true, так что, когда пользователь удаляется, все его покупки и элементы также удаляются. –

ответ

1

Вы получаете цикл, потому что Customer имеет много Purchase с и много Item с, и каждый из этих образований имеют каскадные пути к PurchasedItem. Если у клиента много PurchasedItem s вместо Item - это то, что вы имеете в виду? - это также создало бы цикл.

Cascade направление:

  +----------+  
      | Customer |  
      +--+----+--+  
      | |   
      | |   
+--------+ | | +----+ 
|Purchase| <-+ +-> |Item| 
+----+---+   +--+-+ 
    |     | 
    |     | 
    | +-------------+ | 
    +> |PurchasedItem| <+ 
     +-------------+  
+0

Ваша диаграмма точно показывает взаимосвязь между моими сущностями. Почему это проблема? Я хочу, чтобы CASCADE удалялся от клиента до BuyizedItem. Это возможно? –

+0

Это правило для многих баз данных с каскадными действиями, которые не могут иметь более одного пути к любой таблице (см. [This] (https://technet.microsoft.com/en-us/library/ms186973%28v=sql .105% 29.aspx). Возможно, вам придется использовать триггеры или обрабатывать их вручную. Например, удалите каскадное удаление между 'Customer' и' Item' и перед любыми удалениями 'Customer', удалите его' Item ' первый. – jjj

Смежные вопросы