Ho un database esistente con due tabelle MailServers
e MailDomains
in esso. MailDomains
ha la colonna chiave esterna MailServerId
punta alla colonna della chiave primaria Id
in MailServers
. Quindi abbiamo una relazione uno-a-molti qui.
Ho seguito questo articolo e creato i miei POCO di Entity Framework tramite il modello "Code first from database" nella procedura guidata Entity Data Model. Questo ha prodotto le seguenti due classi C #:
public partial class MailServer
{
public MailServer()
{
MailDomains = new HashSet<MailDomain>();
}
public int Id { get; set; }
public virtual ICollection<MailDomain> MailDomains { get; set; }
}
public partial class MailDomain
{
public MailDomain()
{
}
public int Id { get; set; }
public string DomainName { get; set; }
public int MailServerId { get; set; }
public virtual MailServer MailServer { get; set; }
}
Ora la mia domanda è se c'è qualche differenza tra i seguenti due approcci di creare e inserire nuovi oggetti nel database.
Approccio (A): aggiunta di un nuovo figlio all'elenco dei genitori:
var mailServer = new MailServer();
var mailDomain = new MailDomain() {
DomainName = "foobar.net",
};
mailServer.MailDomains.Add(mailDomain);
using(var context = new MyContext){
context.MailServers.Add(mailServer);
context.SaveChanges();
}
Approccio (B): impostazione della proprietà di navigazione del figlio sul genitore:
var mailServer = new MailServer();
var mailDomain = new MailDomain() {
DomainName = "foobar.net",
MailServer = mailServer,
};
using(var context = new MyContext){
context.MailDomains.Add(mailDomain);
context.SaveChanges();
}
Suppongo inoltre che nel metodo (A) del nuovo MailDomain
istanza viene automaticamente aggiunto ai raccolta context.MailDomains
mentre nel metodo (B) il nuovo MailServer
istanza viene automaticamente aggiunto alla raccolta context.MailServers
. È corretto o devo farlo manualmente?
Quindi, di nuovo, la mia domanda è: i due approcci sono intercambiabili? Mi confonde solo che nel database c'è solo una proprietà / colonna da impostare (vale a dire la chiave esterna in MailDomains
) mentre nel codice C # ci sono due proprietà (una in ogni classe) che possono essere modificate.
Sì, i due approcci sono intercambiabili. Ciò consente di creare e salvare il grafico degli oggetti nel database dalla prospettiva di MailServer o MailDomain.
Se si esegue codice prima, è possibile rimuovere le proprietà e i mapping se non sono necessari.
Suppongo anche che nell'approccio (A) la nuova istanza di MailDomain venga automaticamente aggiunta a context.MailDomains mentre in approach (B) la nuova istanza di MailServer viene automaticamente aggiunta a context.MailServers. È corretto o devo farlo manualmente?
Dipende da cosa intendi per "aggiunto al contesto". Se intendi: viene automaticamente salvato nel database quando persistono, la risposta è sì. Uno dei grandi vantaggi dell'utilizzo di un ORM come EF è che gestisce il salvataggio automatico di un oggetto grafico completo (e la sincronizzazione di relazioni PK / FK, ecc.).
Se intendi: l'entità sarà disponibile tramite il contesto prima di salvare, io non la penso così (non sono sicuro al 100%).