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)
boj*_*boj 19
你有两个选择:
使用DateTime而不是DateOnly。
构建一个自定义转换器(见下文)。
据我所知,Entity Framework Core 问题跟踪器的实际版本表明模型构建器不支持它(在此处查找问题)。构建转换器可能会解决您的问题(引自那里):
protected override void ConfigureConventions(ModelConfigurationBuilder builder)
{
builder.Properties<DateOnly>()
.HaveConversion<DateOnlyConverter, DateOnlyComparer>()
.HaveColumnType("date");
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24430 次 |
| 最近记录: |