如何使用EF Core,代码优先将自动分配的DateTime2数据类型更改为DateTime?

时间:2019-05-07 22:06:32

标签: c# sql-server asp.net-core ef-core-2.2

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

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

之后,我尝试将以下注释添加到DateTime属性中 [Column(TypeName =“ DateTime”)]。之后,我添加了一个迁移,并通过Package Manager Console更新了数据库。这没有任何效果。

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; }

    }
}

2 个答案:

答案 0 :(得分:1)

确保安装Microsoft.EntityFrameworkCore.SqlServer。然后使用TypeName属性:

[Column(TypeName = "datetime")]

如果SQL Server Object Explorer仍显示datetime2,则可能需要退出并重新打开Visual Studio。

答案 1 :(得分:1)

此答案没有提供如何强制EF Core用datetime而不是datetime2创建列的原因,

SQL服务器datetime2datetime之间的主要区别是可以利用的精度和更宽的日期范围。 datetime2的默认值为System.DateTime,并且在使用兼容客户端时没有理由不使用它。

System.DateTime直接映射到SQL Server datetime2,是Microsoft建议的用于在SQL Server中存储System.DateTime的数据类型。

还值得注意的是,datetime2(7)datetime占用更少的字节空间,并提供更高的精度。

请参阅MSDN SQL Server datetime上的注释