2012-10-12 29 views
10

Chcę zdefiniować atrybuty [Required] na złożonym typie w strukturze jednostki. Na przykład mam jednostkę Customer z opcjonalnym Address. Obiekt Adres ma wymaganą właściwość PostCode.Wymagane właściwości w opcjonalnych złożonych typach obiektów Entity Framework

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

public class Customer { 
    public int CustomerId {get;set;} 
    public Address Address {get;set;} 
} 

Nie chcę, aby przechowywać mój typ złożony jako odrębny podmiot (nie jestem w rzeczywistości za pomocą adresu, to po prostu łatwym ilustracją problemu). Nie mogę zostawić Customer.Address NULL, ponieważ to daje błąd:

Null value for non-nullable member. Member: 'Address'.

Gdybym dostarczyć pusty podmiot adresowa, walidacja zawiedzie na polu kod pocztowy ponieważ atrybutu wymagane.

Czy jest jakiś sposób, aby to osiągnąć? Używam EF5/NET4.5.

Odpowiedz

8

Nie jest to możliwe w przypadku typu złożonego. Musisz utworzyć encję Address, jeśli chcesz, aby była ona zerowa.

Co EF zrobi ze złożonym typem, zamapuje właściwości na tę samą tabelę - która brzmi, jakbyś zamierzała.

Z tego powodu - Twój schemat dla przykładu wyglądałby następująco:

enter image description here

Z non wartości pustych kolumnie Address_PostCode, ponieważ nie jest ważny w bazie danych nie jest droga dla EF do utwórz wiersz, bez obiektu mającego adres i kod pocztowy.

+0

Naprawdę miałam nadzieję, że zrobię to bez innej jednostki. Zgaduję, że będę musiał przeprowadzić walidację nieco inaczej. Dzięki za potwierdzenie moich podejrzeń! – Richard

+0

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

Powiązane problemy