Как изменить автоматически назначенный тип данных DateTime2 на DateTime с помощью EF Core, Code First? - PullRequest
0 голосов
/ 08 мая 2019

Я пишу новое приложение с ASP.NET Core 2.2.4 с EF Core Code First подход с миграциями. Я написал свои модели доменов и обновил базу данных через консоль диспетчера пакетов, но в результате все свойства DateTime, имеющиеся у меня во всех моделях доменов, были созданы в виде столбцов таблицы DateTime2 (7). Мне нужно только DateTime.

Сначала я попытался изменить это, написав запрос на SQL-сервере, чтобы изменить тип данных, и в SQL Server это показало, что оно изменилось на datetime. Но когда я открываю Обозреватель объектов SQL Server в Visual Studio, он все равно показывает столбец как тип datetime2 (7).

После этого я попытался добавить следующую аннотацию к свойствам DateTime. [Столбец (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; }

    }
}

Ответы [ 2 ]

1 голос
/ 08 мая 2019

В этом ответе не указано, как заставить EF Core создать столбец с datetime вместо datetime2, потому что это не нужно.

Основное различие между сервером SQL datetime2 иdatetime - это точный и более широкий диапазон дат, который можно использовать.По умолчанию будет datetime2 для System.DateTime, и нет причин не использовать его при использовании совместимого клиента.

System.DateTime сопоставляется непосредственно с SQL Server datetime2 и являетсяMicrosoft рекомендует тип данных для хранения System.DateTime в SQL Server.

Также стоит отметить, что datetime2(7) занимает на один байт меньше, чем datetime, и обеспечивает повышенную точность.

См. Примечание по MSDN SQL Server datetime

1 голос
/ 08 мая 2019

Убедитесь, что вы установили Microsoft.EntityFrameworkCore.SqlServer.Затем используйте атрибут TypeName:

[Column(TypeName = "datetime")]

Если в обозревателе объектов SQL Server по-прежнему отображается datetime2, возможно, потребуется закрыть и снова открыть Visual Studio.

...