2013-05-05 3 views
20

Для сложного типа в рамках сущности только с обнуляемыми свойствами, почему что-то вроде следующего требует сложного типа быть создан:Сложных типов обнуляемых значений

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

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

Более конкретно, если вы этого не сделаете объявить и указать тип, вы получите значение «Null» для члена, не являющегося nullable. Member: «Адрес». Согласно this question.

До тех пор, пока все свойства комплексного типа имеют значение NULL, почему структура объекта требует экземпляра Address? Поскольку Address1 имеет значение NULL, почему он не может просто предположить это и создать таблицу (и столбец Address_Address1) и нулевое значение в строке, как если бы я создал экземпляр Address с нулевым адресом1?

Или есть атрибут/текущая настройка, которую я могу применить для достижения этого?

+0

Может быть, вы не выделили память для адреса, используя нулевой оператор. –

+2

Это действительно плохая особенность EF. Используя отражение объекта Address, EF может легко определить, какие столбцы создавать при создании таблицы. Для этого не требуется иметь экземпляр адреса от объекта. И при создании/обновлении сущности, если свойство ComplexType было равно null, то чем тяжело устанавливать эти столбцы в базе данных на нуль? Это должно быть легкой возможностью добавить к следующей версии EF IMO. – Ibraheem

ответ

8

посмотреть на этот вопрос Entity Framework 5 DbUpdateException: Null value for non-nullable member.

вам необходимо создать сложный тип, даже если все свойства равны нулю.

+0

В моем случае я не создал экземпляр сложного типа (у экземпляра, кстати, нет свойства null), и я получаю это исключение – reddy

8

Даже если свойства имеют значение NULL, класс, содержащий их, не является. Вы можете иметь Address.Address1 как null, но Address сам должен быть создан.

+0

Конечно, адрес класса имеет значение NULL, поскольку это не тип значения, но проблема лежит с самим EF и его обработкой «сложных типов». – Shautieh

+0

Это не ограничивается сложными типами EF; если «Адрес» равен нулю, вы не сможете получить доступ к «Address.Address1» без исключения ссылочной ссылки. Хотя я признаю, что этот ответ был плохо сформулирован; Я написал это в спешке. Я исправлю это в какой-то момент. – anaximander

+0

Конечно, если адрес здесь не был сложным типом (например, свойство навигации), то null был бы полностью приемлемым. Таким образом, ошибка «Null value for non-nullable member» действительно связана с тем, что «Адрес» был объявлен как сложный тип для EF. – Shautieh

Смежные вопросы