Моего кода-первая модель 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.
Не удалось создать ограничение или индекс. См. Предыдущие ошибки.
, которые должны работать ... у вас есть какие-либо другие отношения между тремя таблицами? – jjj
Нет, я этого не делаю. Единственное другое отношение заключается в том, что «клиент» имеет каскадное удаление, установленное в true, так что, когда пользователь удаляется, все его покупки и элементы также удаляются. –