将 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 => f.Age).ToArray()
将不起作用。以上是关于将 NULL 映射到类型默认值的主要内容,如果未能解决你的问题,请参考以下文章
在 BigQuery 中加载 avro 文件 - 默认值的类型为意外类型。预期为 null,但找到字符串:“null”