2013-05-05 18 views
20

Per un tipo complesso in Entity Framework con solo proprietà nullable, perché è che per qualcosa di simile al seguente richiede un'istanza del tipo complesso:complessi Tipi di Nullable Valori

[ComplexType] 
public class Address { 
    public string Address1 { get; set; } 
} 

public class Customer { 
    [Key] 
    public int CustomerId {get;set;} 
    public Address Address {get;set;} 
} 

Più in particolare, se non lo fai dichiarare e indirizzare il tipo, si ottiene un "valore Null per membro non annullabile Membro: 'Indirizzo'." Come da this question.

Fintantoché tutte le proprietà nel tipo complesso sono annullabili, perché il framework di entità richiede un'istanza di indirizzo? Dato che Address1 è annullabile, perché non può semplicemente assumere che e creare la tabella (e la colonna Address_Address1) e il valore nullo nella riga come se avessi creato un'istanza di Address con un indirizzo1 nullo?

Oppure esiste un attributo/impostazione fluente che posso applicare per ottenerlo?

+0

Potrebbe non essere allocata memoria per indirizzo utilizzando operatore Null. –

+2

Questa è una caratteristica davvero negativa di EF. Utilizzando la riflessione su un oggetto Address, EF può facilmente capire quali colonne creare sulla creazione di una tabella. Non ha bisogno di avere un'istanza di Address dall'entità per risolverlo. E sulla creazione/aggiornamento di entità, se la proprietà ComplexType era nulla, cosa c'è di così difficile nell'impostare quelle colonne nel database in null? Questa dovrebbe essere una semplice aggiunta alla prossima versione di EF IMO. – Ibraheem

risposta

8

Anche se le proprietà sono annullabili, la classe che le contiene non lo è. È possibile avere Address.Address1 come null, ma lo stesso Address deve essere istanziato.

+0

Ovviamente l'indirizzo della classe è nullable in quanto non è un tipo di valore, ma il problema si trova con EF stesso e la sua gestione di "tipi complessi". – Shautieh

+0

Non è limitato ai tipi complessi EF; se 'Address' è nullo non sarà possibile accedere a' Address.Address1' senza un'eccezione di riferimento null. Anche se ammetto che questa risposta era mal formulata; L'ho scritto di fretta. Lo aggiusterò ad un certo punto. – anaximander

+0

Ovviamente ma se Indirizzo non era un tipo complesso qui (ad esempio una proprietà di navigazione) allora null sarebbe totalmente accettabile. Quindi l'errore "Valore nullo per membro non annullabile" è in realtà legato al fatto che "Indirizzo" è stato dichiarato come un tipo complesso per EF. – Shautieh

Problemi correlati