无法映射该属性,因为它的类型为“DateOnly”,该类型不是受支持的基元类型或有效的实体类型

问题描述 投票:0回答:1

无法映射属性“Ogrenci.OgrenciBirthDate”,因为它的类型为“DateOnly”,该类型不是受支持的基元类型或有效的实体类型。显式映射此属性,或者使用“[NotMapped]”属性或使用“OnModelCreating”中的“EntityTypeBuilder.Ignore”忽略它。

    //modelclass


    [DisplayName("Doğum Tarihi")]
    public DateOnly OgrenciBirthDate { get; set; }


    //controller
    [HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult Create(Ogretmen obj)
    {

        if (ModelState.IsValid)
        {
            //obj.OgretmenBirthDate = DateTime.Now;
            _db.Ogretmenler.Add(obj);
            _db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(obj);
    } 

我收到此错误,我正在尝试获取用户的出生日期并将其收集在 sql 中,我只想要日期,而不是时间,所以首先我尝试使用 DateTime 执行此操作,但它给出了另一个错误,并且还给出了时间我不想要的值。我该怎么办

c# sql entity-framework ef-code-first .net-6.0
1个回答
10
投票

这里是

DateOnly
的转换器,其中数据库中的列类型是
date

public class DateOnlyConverter : ValueConverter<DateOnly, DateTime>
{
    public DateOnlyConverter() 
        : base(dateOnly => 
                dateOnly.ToDateTime(TimeOnly.MinValue), 
            dateTime => DateOnly.FromDateTime(dateTime)) { }
}

将以下方法添加到您的

DbContext
类中,该类处理
DateOnly

类型模型中所有属性的转换
protected override void ConfigureConventions(ModelConfigurationBuilder builder)
{

    builder.Properties<DateOnly>()
        .HaveConversion<DateOnlyConverter>()
        .HaveColumnType("date");

    base.ConfigureConventions(builder);

}

在模型中设置属性

public DateOnly? OgrenciBirthDate { get; set; }

另请参阅会议前配置

Udate 02/2023 现在有一个 NuGet 包ErikEJ.EntityFrameworkCore.SqlServer.DateOnlyTimeOnly

更新 7/27/2023

请参阅 EF Core 8 预览版了解 SQL Server 上支持的 DateOnly/TimeOnly

更新11/2023

EF Core 8 原生支持 DateOnly 和 TimeOnly

SQL Server 日期和时间现在支持 .NET DateOnly

© www.soinside.com 2019 - 2024. All rights reserved.