将 NULL 映射到类型默认值

Posted

技术标签:

【中文标题】将 NULL 映射到类型默认值【英文标题】:Mapping NULLs to type default 【发布时间】:2019-08-17 04:13:59 【问题描述】:

我有需要与 Entity Framework Core 一起使用的模型类。不幸的是,我无法对这些类进行更改,并且它们都没有使用可为空的列,而它们映射到的数据库表确实具有可为空的列。 EF 在尝试将数据从数据库拉入模型类时抛出(预期的)异常。

有没有办法将 EF Core 配置为自动将列中的 NULL 映射到给定类型的默认值?

例如,

//Model class
class Foo

    public int Id get; set;
    public int Age get; set;


//DbContext
public class MyContext: DbContext

    protected override void OnModelCreating(ModelBuilder modelBuilder)
     
        modelBuilder.Entity<MyContext>(entity =>
        
            entity.HasKey(e => new  e.Id );
            entity.ToTable("Foo", "dbo");
            entity.Property(e => e.Age).HasColumnName("Age");
        
    

目标是在请求数据时,Age 列中的 null 将成为默认类型(在本例中为 0)。

【问题讨论】:

起初,我认为value conversion 可以解决这个问题,但不幸的是,它不能转换null。另见Allow HasConversion/ValueConverters to convert nulls 【参考方案1】:

如果你可以改变类的实现不改变它的公共定义,你可以这样做.

public class Foo

    public int Id  get; set; 
    private int? _Age  get; set; 
    public int Age
    
        get => _Age.GetValueOrDefault();
        set => _Age = value;
    


public class MyContext : DbContext

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    
        modelBuilder.Entity<Foo>(entity =>
        
            entity.Property("_Age").HasColumnName("Age");
            entity.Ignore(e => e.Age);
        );
    

【讨论】:

这是一个很好的解决方案。感谢您的考虑! 不客气!您可能还想投票github.com/aspnet/EntityFrameworkCore/issues/13850,这是一个更好的解决方案。 :) 小心,因为这可能会破坏您退出的查询。例如dbContext.Foos.OrderBy(f =&gt; f.Age).ToArray() 将不起作用。

以上是关于将 NULL 映射到类型默认值的主要内容,如果未能解决你的问题,请参考以下文章

关于java中属性变量默认值的问题。

雪花复制命令以将默认值替换为 null

在 BigQuery 中加载 avro 文件 - 默认值的类型为意外类型。预期为 null,但找到字符串:“null”

详解对象-关系映射文件

edittext.settext() 将键盘类型更改为默认值 [从 ?123 到 ABC]

在目标 c 中使用 jsonModel 映射时将默认值设置为空字段