将必填字段映射到数据库中可为空

时间:2013-03-07 12:39:01

标签: entity-framework ef-code-first

我有一个实体框架代码优先模型,其中供应商必须始终拥有SupplierGroup:

    public virtual SupplierGroup SupplierGroup { get; set; }
    public int SupplierGroupId { get; set; }

但底层数据库必须将SupplierGroupId视为可为空(由于另一个系统使用它,其中供应商可以在没有SupplierGroup的情况下存在)。

有没有办法让Entity Framework生成/映射到可以为空的数据库字段,但是否则继续根据需要处理模型中的字段?

我尝试了一个流畅的映射:

modelBuilder.Entity<Supplier>()
     .Property(s => s.SupplierGroupId)
     .IsOptional();

但是当代码优先生成数据库时,该字段仍然不可为空。

(如果曾经要求没有供应商集团的供应商,这应该抛出异常,因为它永远不会发生)。

1 个答案:

答案 0 :(得分:2)

使用默认数据库初始化程序创建具有Entity Framework的数据库是不可能的,因为int属性将导致可为空的列。据我所知,你的选择是:

  1. 编写一个执行SQL脚本的自定义数据库初始化程序,该脚本将列从不可空的列更改为可为空的列

  2. 不要使用Entity Framework创建数据库,而是手动(例如,通过将数据库初始化程序设置为null),具有可为空的列和不可为空的属性

    < / LI>
  3. 将您的需求视为未在数据库中反映的特定于应用程序的业务逻辑(并且不能因为访问数据库的其他应用程序需要允许NULL s),即创建属性int?并确保在您的应用程序中永远不会使用null

  4. 对于选项1和2,您的模型与数据库“不同步”,这意味着当您从Supplier为{{1}的数据库加载SupplierGroupId时,您将获得异常(可能类似“......无法在非可空属性中存储物化值NULL ...”)。

    我会选择选项3。