Devo definire le mie 3 classi come segue:
public class Table1
{
public Guid Table1CoreId {get;set;}
public string Name {get;set;}
public Table2 Table2 {get;set;}
public Table3 Table3 {get;set;}
}
public class Table2
{
Guid Table1CoreId {get;set;}
}
public class Table3
{
Guid Table1CoreId {get;set;}
}
Come puoi vedere, ho Table2 e Table3 definiti come proprietà in Table1.
Ho provato a utilizzare l'API fluente di EF per definire come dovrebbero essere creati, ma non ottengo il risultato che voglio. Ho bisogno che la mia tabella sia definita come segue:
Tabella 1:
Tavolo 2:
table3:
Table2 ha una relazione 1 a 1 con Table1 mentre Table3 ha una relazione 1-to-M. Entrambe le voci in Table2 e Table3 sono facoltative.
Ho provato il seguente: nelle classi di definizione Table2 e 3 che sto usando, ho usato il seguente:
this.HasRequired(t => t.Table1)
.WithMany()
.HasForeignKey(t => t.Table1CoreId)
.WillCascadeOnDelete(false);
Ma quando creo una migrazione e aggiorno il mio database, crea ulteriori colonne in Table1:
Table2_Table1CoreId
Table2_Id
Table3_Table1CoreId
Table3_Id
Tutte le chiavi primarie e le chiavi esterne vengono create nelle varie tabelle, per quanto posso vedere, ma non voglio che queste colonne aggiuntive vengano create in Table1.
Spero che questo abbia senso e qualcuno può indicarmi la giusta direzione su come risolvere questo problema.
Dopo aver discusso ulteriormente il problema con il mio collega, abbiamo finito per normalizzare ulteriormente la nostra tabella, quindi abbiamo introdotto una tabella aggiuntiva e abbiamo anche rimosso il requisito che una delle tabelle avesse una relazione 1-to-m, quindi tutte le tabelle sono ora 1-a-1. Tutti questi cambiamenti hanno reso molto più facile la definizione delle nostre classi e reso molto più facile la risoluzione dei nostri problemi EF.
Le modifiche finali sono le seguenti:
public class Table1
{
public Guid Table1CoreId {get;set;}
public string Name {get;set;}
}
public class Table2
{
Guid Table1CoreId {get;set;}
int Table2CoreId {get;set;}
}
public class Table3
{
Guid Table2CoreId {get;set;}
}
public class Table4
{
Guid Table2CoreId {get;set;}
}
Nella classe di configurazione Table2, ho aggiunto quanto segue:
public class Table2Configuration : EntityTypeConfiguration<Table2>
{
...
this.HasOptional(t => t.Table3)
.WithRequired(o => o.Table2)
.WillCascadeOnDelete(true);
this.HasOptional(t => t.Table4)
.WithRequired(o => o.Table2)
.WillCascadeOnDelete(true);
}
e i nostri tavoli ora assomigliano a questo:
Tabella 1:
Tavolo 2:
table3:
Table4:
E come originariamente richiesto, non ci sono campi aggiuntivi aggiunti in Tabella1.
Nota: in base alla mia domanda iniziale, sono riuscito a risolvere il problema dei campi aggiuntivi aggiungendo l'attributo [ForeignKey ("Table1CoreId, Id")] a entrambe le proprietà di navigazione (ad esempio Table2 e Table3) definite in Table1 ma che non è mai riuscito a risolverlo usando EF Fluent API mentre finivamo per ridisegnare le classi e le tabelle.