2013-05-05 17 views
20

Dla typu złożonego w ramach podmiotu wyłącznie z właściwości pustych, dlaczego jest to, że za coś takiego jak poniżej wymaga kompleks typ być instancja:Złożone Rodzaje Nullable Wartości

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

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

Dokładniej, jeśli nie zadeklaruj i wpisz adres, otrzymasz "Wartość Null dla nie-Nieliniowego członka. Członek:" Adres "." Zgodnie z this question.

Dopóki wszystkie właściwości w typie złożonym są zerowalne, dlaczego struktura encji wymaga wystąpienia adresu? Ponieważ adres 1 jest zerowalny, dlaczego nie można go po prostu założyć i utworzyć tabelę (i kolumnę Address_Address1) i wartość pustą w wierszu, tak jakbym utworzyła instancję adresu o zerowym adresie 1?

Czy istnieje ustawienie atrybutów/płynności, które mogę zastosować, aby to osiągnąć?

+0

Być może nie przydzielono pamięci dla adresu przy użyciu operatora null. –

+2

To jest naprawdę zła cecha EF. Używając refleksji na obiekcie Address, EF może łatwo ustalić, jakie kolumny utworzyć przy tworzeniu tabeli. Nie musi mieć instancji Adres z jednostki, aby to rozwikłać. A jeśli chodzi o tworzenie/aktualizowanie encji, jeśli właściwość ComplexType miała wartość NULL, co jest trudniejsze w ustawianiu tych kolumn w bazie danych na wartość null? To powinno być łatwym dodatkiem do kolejnej wersji EF IMO. – Ibraheem

Odpowiedz

8

Nawet jeśli właściwości są nullami, klasa je zawierająca nie jest. Możesz mieć Address.Address1 jako null, ale sama instancja musi zostać utworzona.

+0

Oczywiście adres klasy jest zerowy, ponieważ nie jest typem wartości, ale problem leży w samym EF i jego obsłudze "typów złożonych". – Shautieh

+0

Nie ogranicza się do typów złożonych EF; jeśli "Address" ma wartość null, nie będziesz mieć dostępu do 'Address.Address1' bez wyjątku odwołania do wartości zerowej. Chociaż przyznaję, że ta odpowiedź była źle sformułowana; Napisałem to w pośpiechu. Naprawię to w pewnym momencie. – anaximander

+0

Oczywiście, ale jeśli adres nie był tutaj typem złożonym (np. Właściwość nawigacji), wówczas wartość null byłaby całkowicie akceptowalna. Tak więc błąd "Null value for non-nullable member" jest tak naprawdę związany z faktem, że "Address" zostało zadeklarowane jako typ złożony dla EF. – Shautieh