Quando aggiungo proprietà extra a una classe generata automaticamente da EF utilizzando una classe parziale aggiuntiva, queste proprietà non vengono compilate o riempite quando si eseguono query sul database.Le proprietà extra di Entity Framework non vengono popolate da DbContext.Database.SqlQuery
Esempio:
persona di classe generata automaticamente:
public partial class Person
{
public string Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
mia classe parziale
public partial class Person
{
public string DisplayName{ get; set; }
}
Quando faccio la seguente query:
"SELECT *, (FirstName + LastName) AS DisplayName FROM [Person]"
e l'uso
DbContext.Database.SqlQuery(typePerson, SQL, null)
l'Id, Nome e cognome sono popolate, ma non il DisplayName.
Tuttavia quando creo una nuova classe chiamata myPerson
public partial class MyPerson
{
public string Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string DisplayName{ get; set; }
}
e si esegue la stessa query con il tipo di myPerson il DisplayName è popolata pure.
Qualcuno può spiegare questo o dirmi come posso risolvere questo problema, quindi posso utilizzare Partials invece di dover creare nuove classi/tipi.
Scarica un esempio: https://www.dropbox.com/s/dayrv0jzuoju9q3/StackOverflow_EF_ExtraProperties.zip?dl=0
UPDATE 2015/12/28: Durante la lettura attraverso altri StackOverflow e forum CodeProject ho trovato un altro modo per farlo funzionare:
1) Utilizzando TypeBuilder (http://www.codeproject.com/Articles/206416/Use-dynamic-type-in-Entity-Framework-SqlQuery) ma a causa di tutti i tipi di dipendenze del progetto ho avuto problemi nel trovare i tipi già creati e non far esplodere la memoria;
2) Opzione migliore finora: utilizzo dell'ereditarietà.
Quando creo un'altra classe con solo queste righe:
class Person_Reflect : Person { }
posso utilizzare il seguente codice (ignorerà il mapping nel file e l'uso di riflessione EDMX:
List<EF.Person> listPerson = dbEntities.Database.SqlQuery<EF.Person_Reflect>(sql, new object[] { }).ToList<EF.Person>();
Sei certo che la seconda classe parziale di 'Person' è nel namespace giusto? –
E nessuna eccezione dal momento che hai cambiato il modello? – dotctor
Vedete DisplayName come una proprietà senza valore? –