Avatar
Petr Nymsa
Redaktor
Avatar
Petr Nymsa:

Ahoj mám 2 entity

Product

public int ID { get; set; }
...
 public ICollection<Category> Categories { get; set; }

Category

public int ID { get; set; }

public int? ParentID { get; set; }
public Category Parent { get; set; }

public ICollection<Product> Products { get; set; }

Product a Category mají vazbu M:M (Many to Many).

Pomocí Fluent API jsem nastavil

modelBuilder.Entity<Category>().HasOptional(c => c.Parent).WithMany().HasForeignKey(c => c.ParentID).WillCascadeOnDelete(true);

           modelBuilder.Entity<Category>().HasMany(c => c.Products).WithMany(c => c.Categories);

Při Update-Database mi zahlásí chybu

Introducing FOREIGN KEY constraint 'FK_dbo.Catego­ries_dbo.Cate­gories_ParentID' on table 'Categories' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

Could not create constraint

Mým cílem je mít vazbu M:M a zároveň u Category mít Foreign Key sám na sebe (pro stromové menu). A navíc chci nastavit CASCADE delete při smazání jedné kategorie. Jak toho docílit?

Vím, že je problém s tím, že je tam více cest kudy EF může "kaskádovat", ale nevím jak to opravit. Díky moc za radu

Odpovědět 29.7.2015 20:35
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Lako
Člen
Avatar
Odpovídá na Petr Nymsa
Lako:

Obecně bych cascade delete vůbec nezaváděl. Může se stát, že omylem smažeš něco co nechceš. Na takové rady jsi ale zkušený dost...
Problém je v tom, že EF neví, co má udělat s takovouhle kaskádou (právě z toho důvodu, že se může dostat do cyklu).
A co s ní chceš vlastně udělat ty? Když chceš smazat nějakou kategorii, která není listem - co se stane s těma kategoriema po tou mazanou? Také se mají smazat? Nebo se to má posunout všechno o jednu úroveň výš?
Předpokládám, že chceš smazat všechno. Zřejmě to budeš muset implementovat - doskáčeš na listy a od nich to umažeš. Při větších stromech to asi bude mít problém s výkonem.
Řekl bych, že toto mazání je hlavní nevýhoda ukládání stromové struktury pouze pomocí odkazu na předka.
hezké články(i když trochu OT): http://www.zdrojak.cz/…-databazi-i/
Tabulka Product s tím dle mého názoru nemá nic společného (zkus schválně dát pryč vlastnost Products ) .

 
Nahoru Odpovědět 29.7.2015 22:58
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.