可空值的复合类型

21

对于Entity Framework中只有可空属性的复杂类型,为什么像以下这样的东西需要实例化复杂类型:

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

public class Customer {
    [Key]
    public int CustomerId {get;set;}
    public Address Address {get;set;}
}
更具体地说,如果您未声明和指定类型,则会收到“非空成员的空值。成员:'Address'。”的错误信息。详情请参见此问题
只要复杂类型中的所有属性都是可空的,为什么实体框架还需要一个地址实例?既然Address1为空,为什么不能假设并创建表格(和Address_Address1列),并在行中使用null值,就好像我已经创建了一个带有null Address1的Address实例一样?
或者,是否可以应用属性/流畅设置以实现这一点?

也许您没有使用空操作符为地址分配内存。 - rishikesh tadaka
2
这是EF的一个非常糟糕的特性。使用Address对象上的反射,EF可以轻松地确定在表创建时要创建哪些列。它不需要从实体中获取Address的实例来工作。并且在实体创建/更新时,如果ComplexType属性为空,那么将这些列设置为null在数据库中有什么难度呢?在我看来,这应该是下一个EF版本中容易添加的功能。 - Ibraheem
2个回答

8

在我的情况下,我没有实例化复杂类型(顺便说一下,该实例没有空属性),但我仍然收到了这个异常。 - tobiak777

8
即使属性可为空,包含它们的类也不能为null。你可以让 Address.Address1null,但Address本身必须被实例化。

当然,Address类是可空的,因为它不是值类型,但问题在于EF本身及其对“复杂类型”的处理。 - Shautieh
这不仅限于EF复杂类型; 如果“地址”为空,您将无法访问“地址1”而不会出现空引用异常。虽然我承认这个答案措辞不当; 我匆忙写下了它。我会在某个时候修复它。 - anaximander
当然,但是如果Address不是一个复杂类型(例如导航属性),那么null将是完全可以接受的。因此,“非可空成员的空值”错误实际上与“Address”被声明为EF的复杂类型有关。 - Shautieh
啊,我明白了。是的,我觉得我们在这里说话有些误解了;你是完全正确的。 - anaximander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接