【问题标题】:Complex Types of Nullable Values可空值的复杂类型
【发布时间】:2013-05-05 02:02:22
【问题描述】:

对于实体框架中只有可以为空的属性的复杂类型,为什么像下面这样需要实例化复杂类型:

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

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

更具体地说,如果您不声明和地址类型,您将获得“不可为空成员的空值。成员:'地址'。”根据this question

只要复杂类型中的所有属性都可以为空,为什么实体框架需要Address的实例?既然 Address1 可以为空,为什么它不能只假设并在行中创建表(和列 Address_Address1)和空值,就好像我创建了一个带有空 Address1 的 Address 实例?

或者是否有我可以应用的属性/流畅设置来实现这一点?

【问题讨论】:

  • 可能是您没有使用空运算符为地址分配内存。
  • 这是 EF 的一个非常糟糕的功能。使用 Address 对象上的反射,EF 可以轻松计算出在创建表时要创建哪些列。它不需要来自实体的 Address 实例来解决这个问题。在实体创建/更新时,如果 ComplexType 属性为空,那么将数据库中的这些列设置为空有什么难的?这应该是 EF IMO 下一版本的一个简单功能。

标签: c# entity-framework


【解决方案1】:

看看这个问题Entity Framework 5 DbUpdateException: Null value for non-nullable member

即使所有属性都为空,您也需要实例化复杂类型。

【讨论】:

  • 在我的情况下,我没有实例化复杂类型(顺便说一下,实例没有 null 属性),我得到了这个异常
【解决方案2】:

即使属性可以为空,包含它们的类也不能。您可以将Address.Address1 设为null,但Address 本身必须被实例化。

【讨论】:

  • 当然,类 Address 可以为空,因为它不是值类型,但问题在于 EF 本身及其对“复杂类型”的处理。
  • 不限于EF复杂类型;如果Address 为空,您将无法在没有空引用异常的情况下访问Address.Address1。尽管我承认这个答案措辞很糟糕;我着急写了。我会在某个时候修复它。
  • 当然,但如果 Address 在这里不是一个复杂类型(例如导航属性),那么 null 将是完全可以接受的。因此,“不可为空成员的空值”错误实际上与“地址”被声明为 EF 的复杂类型这一事实有关。
  • 啊,我明白了。是的,我认为我们在这里一直在谈论不同的目的;你完全正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
  • 1970-01-01
  • 2012-10-06
相关资源
最近更新 更多