如何让 EF Core 6 支持 DateOnly 类型

问题重现

假设有下列实体类:

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }        
    public DateOnly Birthday { get; set; }
}

由于Birthday只需要日期,所以我们使用了DateOnly类型。

但是,在使用 EF Core 6 存储到数据库时,出现如下错误:

由于数据库没有 DateOnly 类型,我们使用的是 datetime 类型

结果DateOnly不能被 Map 成datetime数据库类型。

重载 OnModelCreating

根据提示,我们重载了OnModelCreating方法,发现有个HasColumnType方法,用于配置属性在面向关系数据库时映射到的列的数据类型:

modelBuilder.Entity<User>()
  .Property(t => t.Birthday)
    .HasColumnType("datetime");

但是,没有任何效果。

HasConversion 方法

继续查找,发现还有个HasConversion方法,用于配置属性,以便在写入数据库之前转换属性值并在从数据库中进行读取时转换回:

modelBuilder.Entity<User>()
  .Property(t => t.Birthday)
    .HasConversion(
        d => d.ToDateTime(TimeOnly.MinValue),
        d => DateOnly.FromDateTime(d));

现在,EF Core 6 已经可以正确地处理 DateOnly,并使用datetime数据库类型来存储它。

结论

今天,我们介绍了使用转换器来告诉 EF Core 6 如何处理 DateOnly。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您要使用Entity Framework Core来保存父类类型指向子类对象,可以使用继承映射。在继承映射中,您可以使用Discriminator列来标识每个子类类型。首先,将父类类型定义为抽象类,并在其上使用`[Table("ParentTable")]`属性进行标记。然后,为每个子类类型创建一个具体类,并在其上使用`[Table("ChildTable")]`属性进行标记,并通过继承父类类型来继承对其属性和方法的访问。 在实体类中,使用`[Discriminator]`属性标识每个子类的类型,然后使用`HasDiscriminator()`方法配置其Discriminator列。最后,使用`HasBaseType()`方法将子类类型与父类类型相关联。下面是一个示例代码: ```csharp [Table("ParentTable")] public abstract class Parent { public int Id { get; set; } public string Name { get; set; } } [Table("ChildTable")] public class Child1 : Parent { public int Age { get; set; } } [Table("ChildTable")] public class Child2 : Parent { public string Address { get; set; } } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Parent>() .HasDiscriminator<string>("Discriminator") .HasValue<Child1>("Child1") .HasValue<Child2>("Child2"); modelBuilder.Entity<Child1>(); modelBuilder.Entity<Child2>(); } ``` 通过这种方式,您可以将父类类型指向子类对象,并在数据库中使用Discriminator列标识每个子类的类型。保存实体时,EF Core会自动将其保存到正确的表中,并使用Discriminator列来标识其类型

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值