2

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

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

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

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

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

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

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

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

4

1 回答 1

3

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

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

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

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

对于选项 1 和 2,您的模型与数据库“不同步”,这意味着当您Supplier从数据库加载 a 时会出现SupplierGroupId异常NULL(可能类似于“...无法在非可为空的属性...”)。

我会选择选项3。

于 2013-03-07T18:58:50.387 回答