如何使用 EF Core 将自动分配的 DateTime2 数据类型更改为 DateTime,Code First?

She*_*erd 5 c# sql-server asp.net-core ef-core-2.2

我正在使用 ASP.NET Core 2.2.4 和 EF Core Code First 迁移方法编写一个新应用程序。我编写了域模型并通过包管理器控制台更新了数据库,但这导致我在整个域模型中拥有的所有 DateTime 属性都被创建为 DateTime2(7) 表列。我只需要日期时间。

首先,我尝试通过在 SQL Server 中编写查询来更改数据类型来更改此设置,结果确实如此,在 SQL Server 内部显示它已更改为日期时间。但是当我在 Visual Studio 中打开 SQL Server 对象资源管理器时,它仍然将该列显示为 datetime2(7) 类型。

之后,我尝试将以下注释添加到 DateTime 属性 [Column(TypeName = "DateTime")]。之后我添加了迁移并通过包管理器控制台更新了数据库。这没有任何效果。

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Web;

namespace GYM.CoreApp.WebUI.Models
{
    public class Employee
    {
        [Key]
        public int EmployeeId { get; set; }

        [Required]
        [MaxLength(100), MinLength(2)]
        [Display(Name ="First Name")]
        public string FirstName { get; set; }

        [Required]
        [MaxLength(100), MinLength(2)]
        [Display(Name = "Last Name")]
        public string LastName { get; set; }

        [Required]
        [Column(TypeName = "DateTime")]
        [Display(Name = "Date of birth")]
        public DateTime DateOfBirth { get; set; }

        [Required]
        [MaxLength(13), MinLength(13)]
        [Display(Name = "EMBG")]
        public string EMBG { get; set; }

        [Required]
        [MaxLength(200), MinLength(2)]
        [Display(Name = "Home address")]
        public string Address { get; set; }

        [Required]
        [MaxLength(13), MinLength(9)]
        [Display(Name = "Phone number")]
        public string PhoneNumber { get; set; }

        [Required]
        [Display(Name = "Salary per month")]
        public int SalaryPerMonth { get; set; }

        [Required]
        [Column(TypeName = "DateTime")]
        [Display(Name = "Date when joined company")]
        public DateTime DateWhenJoined { get; set; }

        [Required]
        [Display(Name = "Still Employed")]
        public bool StillEmployed { get; set; }

    }
}
Run Code Online (Sandbox Code Playgroud)

b_s*_*til 7

此答案没有提供如何强制 EF Core 创建列而datetime不是datetime2因为您不应该这样做。

datetime2SQL Server与SQL Server 之间的主要区别datetime在于可以利用的精度和更广泛的日期范围。默认值是datetime2a System.DateTime,当您使用兼容的客户端时,没有理由不使用它。

System.DateTime直接映射到 SQL Server datetime2,并且是 Microsoft 推荐的用于在 SQL Server 中存储数据的数据类型System.DateTime

另外值得注意的是,adatetime2(7)比 a 少占用一个字节的空间datetime,并且提供更高的精度。

请参阅MSDN SQL Server 日期时间注释