Sto cercando di capire come trattare con "Caso proprietà di navigazione singola" descritto in questo documento:
Diciamo che abbiamo 2 modelli.
class School
{
public ICollection<Child> Childrens {get; set;}
...
}
e
class Child
{
public int Id {get; set;}
...
}
Quindi è la relazione molti-a-uno creata per convenzione, senza la chiave esterna esplicita in un Child
.
Quindi la domanda è se abbiamo un'istanza di Child
e conosciamo School.Id
c'è un modo per aggiornare questa relazione senza chiamate extra al database per ottenere un'istanza di School
.
Quindi la domanda è se abbiamo un'istanza
Child
e conosciamoSchool.Id
c'è un modo per aggiornare questa relazione senza chiamate extra al database per ottenere un'istanzaSchool
.
Si è possibile. È possibile creare uno stub falso School
istanza di entità con Id
solo, Attach
al DbContext
(in questo modo dicendo al EF che è esistente), Attach
il Child
istanza per lo stesso motivo, e quindi aggiungere il Child
alla raccolta e chiamata genitore SaveChanges
:
Child child = ...;
var schoolId = ...;
var school = new School { Id = schoolId };
context.Attach(school);
context.Attach(child);
school.Childrens.Add(child);
context.SaveChanges();
Aggiornamento: in realtà c'è un altro modo più pulito, poiché anche se l'entità non ha alcuna navigazione o proprietà FK, EF Core ti consente di accedere / modificare le cosiddette proprietà ombra
Le proprietà shadow sono proprietà che non esistono nella classe entità. Il valore e lo stato di queste proprietà sono mantenuti puramente nel Change Tracker.
non appena conosci il nome. Che nel tuo caso, senza configurazione sarebbe per convenzione "SchoolId"
.
Quindi non è necessaria alcuna istanza di entità School
falsa, basta assicurarsi che il Child
sia collegato e quindi semplicemente impostare la proprietà shadow tramite l'API di ChangeTracker:
context.Attach(child);
context.Entry(child).Property("SchoolId").CurrentValue = schoolId;
context.SaveChanges();