L'ORM dovrebbe creare gli oggetti correlati (oggetti ForeignKey) quando si salva l'entità?

2

Questa domanda proviene da una frustrazione quando si utilizza Entity Framework e ASP.NET MVC, ma presumo che si tratti di una frustrazione generale su più framework e linguaggi.

Diciamo che abbiamo un oggetto chiamato Invoice . La fattura ha un Recipient . Nel mio modello a oggetti l'ho impostato in questo modo:

    [ForeignKey("Debtor")]
    public int RecipientId { get; set; }

    public virtual Recipient Recipient { get; set; }

In .NET, e presumibilmente anche in altri framework, ciò significa che quando ho un oggetto Invoice, posso scaricare i dati del destinatario.

Se salvi l'oggetto della fattura, salverà anche l'oggetto destinatario nel database del destinatario. Questo è in alcuni casi molto buono, ma ...

Questo è il mio problema

Ho anche un RecipientService . Qui ho una logica aziendale prima di memorizzare un destinatario. Imposterò una data di creazione, verificherò che alcuni campi siano corretti e imposti altri valori. Quando chiamo il mio metodo Create sul mio RecipientService , funziona perfettamente.

Ma ovviamente, questo codice viene completamente ignorato quando salvi la mia fattura nel database quando utilizzo ORM Entity Framework.

La mia domanda

Qual è l'approccio più comune per risolvere questo problema?

Semplicemente non consentire il salvataggio di oggetti con un oggetto reale come una proprietà e salvarlo semplicemente con il riferimento ID?

Nel mio InvoiceService potrei facilmente dire qualcosa del tipo:

Recipient newRecipient = _recipientService.Create(recipient);
invoice.Recipient = null;
invoice.RecipientId = newRecipient.Id;

Ma questo è davvero l'approccio migliore e più comune?

Spero che qualcuno possa dare una mano qui: -)

    
posta Lars Holdgaard 11.05.2018 - 10:31
fonte

1 risposta

0

Penso che l'approccio comune sia quello di eliminare EF e sostituirlo con repository codificati a mano. Ma!

Qui la fattura è il tuo oggetto radice aggregato. Se lo faccio:

myInvoice.Recipient.Name = "new name";
repo.Save(myInvoice);

Quindi mi aspetto che la modifica del nome sia salvata.

Devi salvare solo fatture e mai destinatari solitari. Ciò consente di inserire tutta la logica aziendale per il salvataggio nel Repository di fatture e garantire che tutte le regole siano applicate.

In alternativa, se rimuovi l'oggetto figlio Recipiente dalla fattura, puoi mantenerli entrambi separatamente, poiché l'unico requisito è che esista un destinatario con l'ID collegato. e questo può essere applicato da entrambi i repository delle fatture e dei destinatari.

    
risposta data 11.05.2018 - 11:11
fonte

Leggi altre domande sui tag