Qui è la mia situazione:Entity Framework: Perché il metodo WillCascadeOnDelete() viene ignorato?
public abstract class Article
{
[key]
public Guid Guid { get; set;}
public string Name { get; set;}
.
.
.
}
public class Download : Article
{
...
}
public abstract class Category : Article
{
...
}
public class DownloadCategory : Category
{
....
}
E poi dovrei avere una relazione molti-a-molti relazione tra Scaricare e DownloadCategory
come questo:
public class DownloadInCategory
{
[Key, Column(Order = 1), Required]
[ForeignKey("Download")]
Public Guid DownloadGuid { get; set; }
Public Download Download { get; set; }
[Key, Column(Order = 2), Required]
[ForeignKey("Category")]
Public Guid CategoryGuid { get; set; }
Public DownloadCategory Category { get; set; }
}
Quando chiamo Add-Migration
la migrazione creata per DownloadInCategory
entità è:
CreateTable("dbo.DownloadInCategories",
c => new
{
CategoryGuid = c.Guid(nullable: false),
DownloadGuid = c.Guid(nullable: false),
})
.PrimaryKey(t => new { t.CategoryGuid, t.DownloadGuid })
.ForeignKey("dbo.DownloadCategories", t => t.CategoryGuid)
.ForeignKey("dbo.Downloads", t => t.DownloadGuid, cascadeDelete: true)
.Index(t => t.CategoryGuid)
.Index(t => t.DownloadGuid);
Ecco la mia domanda: Come si notic e non aggiunge cascadeDelete: true
a una delle chiavi esterne. PERCHÉ!!!!!!?????
Devo dire che non ho modificato nessuna delle convenzioni modelbuilder
. Quindi questo schema dovrebbe aggiungere Casscade all'eliminazione nella migrazione. Le mie proprietà sono [Required]
.
Cosa sto sbagliando?
Grazie ragazzi ...
Aggiornamento: Si prega di notare che Article
e Category
classi sono abstract
. Ho cambiato le classi sopra
Aggiornamento 2: Non v'è alcun problema di logica con questo schema. Se modifico la migrazione manualmente, aggiornerà il database normalmente.
Update 3: My EF Inheritance Metodologia è TPC
Update 4: Dopo alcune indagini e le prove Sembra problema è inheritanced da Category
. Quando DownloadCategory
è ereditato da Category
, Cascade non viene distribuito. ma quando I Inherit DownloadCategory
direttamente dall'articolo, viene distribuito Cascade. Ma perché ancora?
Se si modifica la migrazione funziona manualmente bene, questo è più di una questione teorica sul perché a cascata di eliminazione non è deducibile? – jjj
@jjj No. Questo è completamente pratico dal mio punto di vista. La modifica manuale della migrazione non è affatto una buona pratica. In progetti più grandi come quello a cui sto lavorando, una cosa del genere aggiunge ulteriori considerazioni alla manutenzione e allo sviluppo di nuove funzionalità del progetto. Penso che modificare manualmente la migrazione sia sbagliato. e la migrazione dovrebbe corrispondere allo schema dei modelli. – abzarak
Suppongo che sarebbe vero in un mondo ideale in cui le convenzioni built-in erano perfette. Puoi scavare nel codice sorgente per capire perché questo è successo in questo caso, ma suppongo che sia il risultato di una scorciatoia per evitare i cicli. – jjj