Sto tentando di mappare una raccolta di entità con una proprietà non pubblica, in modo da incapsulare meglio il mio dominio, poiché l'entità che contiene la raccolta deve applicare determinate regole sulla raccolta, ad esempio
public class Foo
{
public AddBar(Bar bar)
{
if (BarsInternal.Count > 4)
{
throw new Exception("Too many Bars!");
}
BarsInternal.Add(bar);
}
public IEnumerable<Bar> Bars
{
get { foreach (var bar in BarsInternal) { yield return bar; } }
}
internal virtual IList<Bar> BarsInternal { get; set; }
}
Per le proprietà non di raccolta, in passato sono stato in grado di farlo rendendo la proprietà interna e semplicemente mappando la proprietà normalmente (applicando InternalsVisibleTo
quando il framework di entità non si trovava nello stesso assembly del modello di dominio) utilizzando una classe di mapping .
Tuttavia, per le raccolte non riesco a farlo funzionare. Se contrassegno la proprietà pubblica e utilizzo la seguente mappatura:
public class FooMap : EntityTypeConfiguration<Foo>
{
public FooMap()
{
this.HasMany(x => x.BarsInternal);
}
}
Quindi, tutto funziona.
Tuttavia, se cambio la proprietà Bars
per essere interna, allora ottengo il seguente comportamento strano:
context.Foos.AddOrUpdate(fooInstance)
completamente la collezione Bars
nel database, come previsto. Foo
dal contesto, la collezione Bars
è sempre vuota . Come posso mappare correttamente una proprietà di raccolta non pubblica in Entity Framework Code?
Cambia i modificatori di accesso di BarsInternal
da internal
a protected internal
e funzionerà correttamente.
Sospetto che la ragione di ciò sia che il framework di entità usa i proxy dietro la scena per le raccolte, e i proxy possono solo "oscurare" la proprietà della raccolta se possono sovrascriverla.