仅日期无法映射 SQL Server 2019

rog*_*nin 35 c# entity-framework-core

我正在尝试使用 c# 的新 DateOnly 方面,但是当我进行迁移时,我遇到了以下问题。我正在使用 SQL Server 2019,错误是。

无法映射“Amenitie.StartDate”,因为它的类型为“DateOnly”,该类型不是受支持的基元类型或有效的实体类型。要么显式映射此属性,要么使用'忽略它

我的模型如下

public class Amenitie
{
    public int? Id { get; set; }
    public Rooms? Rooms { get; set; }
    public string? Description { get; set; }
    public DateOnly StartDate { get; set; }
    public DateOnly EndDate { get; set; }
    public bool? isAvailable { get; set; }
    public bool? isDeleted { get; set; }
    public bool? isActive { get; set; }
    public DateTime? LastModifiedBy { get; set; }
    public DateTime? CreateDate { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的 Dal 项目和我的 web 项目都设置为

<PropertyGroup>
  <TargetFramework>net6.0</TargetFramework>
  <Nullable>enable</Nullable>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

我正在使用以下软件包版本。

<ItemGroup>
 <PackageReference Include="Microsoft.AspNetCore.Identity" Version="2.2.0" />
 <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="5.0.9" />
 <PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.9" />
 <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="5.0.9">
 <PrivateAssets>all</PrivateAssets>
 <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
 </PackageReference>
 <PackageReference Include="Microsoft.EntityFrameworkCore.Relational.Design" Version="2.0.0-preview1-final" />
 <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.9" />
 <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer.Design" Version="2.0.0-preview1-final" />
 <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="5.0.9">
  <PrivateAssets>all</PrivateAssets>
  <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
 </PackageReference>
 <PackageReference Include="Microsoft.Extensions.Configuration" Version="5.0.0" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

我猜可以DateOnly在 EF Core 6 及更高版本中使用吗?

Sve*_*ter 41

尝试这个

public class YourDbContext : DbContext
{
    Ctors() {...}

    protected override void ConfigureConventions(ModelConfigurationBuilder builder)
    {
        builder.Properties<DateOnly>()
                .HasConversion<DateOnlyConverter>()
                .HasColumnType("date");
    }
}
              
/// <summary>
/// Converts <see cref="DateOnly" /> to <see cref="DateTime"/> and vice versa.
/// </summary>
public class DateOnlyConverter : ValueConverter<DateOnly, DateTime>
{
   /// <summary>
   /// Creates a new instance of this converter.
   /// </summary>
   public DateOnlyConverter() : base(
       d => d.ToDateTime(TimeOnly.MinValue),
       d => DateOnly.FromDateTime(d))
  { }
}
Run Code Online (Sandbox Code Playgroud)

编辑:对于 RC2,这不适用于可空类型。

编辑 2:在 NET6 发行版本中,这再次适用于可空类型,而且更重要的是,您不需要为“DateOnly?”提供单独的转换器。不再了。

编辑 3:添加了 NET 8 内置支持,您唯一需要做的是:

public class YourDbContext : DbContext
{
    Ctors() {...}

    protected override void ConfigureConventions(ModelConfigurationBuilder builder)
    {
        builder.Properties<DateOnly>()
           .HasColumnType("date");
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 感觉好像这真的应该被内置。 (18认同)
  • 我认为应该是 HaveColumnType("date") 而不是 HasColumnType("date")。 (2认同)

boj*_*boj 19

你有两个选择:

  1. 使用DateTime而不是DateOnly

  2. 构建一个自定义转换器(见下文)。

据我所知,Entity Framework Core 问题跟踪器的实际版本表明模型构建器不支持它(在此处查找问题)。构建转换器可能会解决您的问题(引自那里):

protected override void ConfigureConventions(ModelConfigurationBuilder builder)
{
   builder.Properties<DateOnly>()
          .HaveConversion<DateOnlyConverter, DateOnlyComparer>()
          .HaveColumnType("date");
}  
Run Code Online (Sandbox Code Playgroud)

  • .NET 6 和 EF Core 是两个不同的项目,属于两个不同的团队。 (6认同)
  • @boj mysql 和 postgresql 映射 dateonly 就可以了 (4认同)
  • 必须首先添加对底层 ADO.NET 提供程序的支持 (Microsoft.Data.SqlClient) (3认同)
  • 更新:似乎已在 EF Core 8 中添加了支持,计划于 2023 年 11 月发布。https://github.com/dotnet/efcore/issues/29989 (2认同)