Ho una classe che contiene alcune proprietà. Per alcune ragioni architettoniche, ho un'istanza di un altro oggetto nella mia classe.
Semplice esempio
public class MyEntity {
public MySubEntity SubEntity {get; set;}
}
Per questo, creo mappe fluenti come:
builder.ToTable(MyEntity.CONST_TABLE_NAME);
builder.HasKey(m => m.Id);
builder.Property(m => m.Column1).IsRequired();
builder.Property(m => m.SubEntity.Column2).IsRequired();
Non riesco a integrare tutte le mie proprietà di subtestità nella mia entità principale (la mia sottoreità ha la sua intelligenza). Voglio solo mappare le mie proprietà di subentity, che NON sono memorizzate in una tabella separata, nella tabella myEntity.
L'ultima riga genera un'eccezione:
The expression 'm => m.SubEntity.Column2' is not a valid property expression. The expression should represent a property access: 't => t.MyProperty'.
Come posso eseguire tale mappatura?
EF Core non supporta questo tipo di mappatura per ora. Non sarà supportato in EF Core 1.0 RTM (vedi il mio problema github: https://github.com/aspnet/Home/issues/1330 )
Come ho descritto nel mio problema github, ho trovato 2 soluzioni:
1) Creare una classe derivata dal mio modello, appositamente progettata per EF, ed esporre tutte le proprietà come semplici. Avrà bisogno di più mappature quando inserisci / aggiorna e recupera da Db. Non scegliamo questa opzione
2) Crea proprietà proxy. Nel mio esempio, questo è come:
public class MyEntity {
private MySubEntity SubEntity {get; set;}
public string SubEntityValue
{
get
{
return SubEntity.Value;
}
set
{
SubEntity.Value = value;
}
}
Questa sembra essere la soluzione migliore (scegliamo questa).