我有一个实体框架代码优先模型,其中供应商必须始终拥有SupplierGroup:
public virtual SupplierGroup SupplierGroup { get; set; }
public int SupplierGroupId { get; set; }
但底层数据库必须将SupplierGroupId视为可为空(由于另一个系统使用它,其中供应商可以在没有SupplierGroup的情况下存在)。
有没有办法让Entity Framework生成/映射到可以为空的数据库字段,但是否则继续根据需要处理模型中的字段?
我尝试了一个流畅的映射:
modelBuilder.Entity<Supplier>()
.Property(s => s.SupplierGroupId)
.IsOptional();
但是当代码优先生成数据库时,该字段仍然不可为空。
(如果曾经要求没有供应商集团的供应商,这应该抛出异常,因为它永远不会发生)。
答案 0 :(得分:2)
使用默认数据库初始化程序创建具有Entity Framework的数据库是不可能的,因为int
属性将导致可为空的列。据我所知,你的选择是:
编写一个执行SQL脚本的自定义数据库初始化程序,该脚本将列从不可空的列更改为可为空的列
不要使用Entity Framework创建数据库,而是手动(例如,通过将数据库初始化程序设置为null
),具有可为空的列和不可为空的属性
将您的需求视为未在数据库中反映的特定于应用程序的业务逻辑(并且不能因为访问数据库的其他应用程序需要允许NULL
s),即创建属性int?
并确保在您的应用程序中永远不会使用null
对于选项1和2,您的模型与数据库“不同步”,这意味着当您从Supplier
为{{1}的数据库加载SupplierGroupId
时,您将获得异常(可能类似“......无法在非可空属性中存储物化值NULL ...”)。
我会选择选项3。