Значение по умолчанию не соблюдается с помощью Entity Framework Core Insert - PullRequest
0 голосов
/ 21 марта 2019

Моя таблица SQL Server 2017 создается в Transact-SQL следующим образом:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[JobTag]
(
    [JobId] [int] NOT NULL,
    [Name] [nvarchar](64) NOT NULL,
    [Created] [datetime] NOT NULL,
    [Value] [nvarchar](max) NULL,
    [Comment] [nvarchar](2048) NULL,

    CONSTRAINT [PK_JobTag_1] 
       PRIMARY KEY CLUSTERED ([JobId] ASC, [Name] ASC)
                   WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                         IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

ALTER TABLE [dbo].[JobTag] 
    ADD CONSTRAINT [DF_JobTag_Created] DEFAULT (GETDATE()) FOR [Created]
GO

ALTER TABLE [dbo].[JobTag]  WITH CHECK 
    ADD CONSTRAINT [FK_JobTag_job] 
        FOREIGN KEY([JobId]) REFERENCES [dbo].[job] ([JobID])
GO

ALTER TABLE [dbo].[JobTag] CHECK CONSTRAINT [FK_JobTag_job]
GO

Для модели я включаю

 public System.DateTime Created { get; set; }

В .Net Core, когда я пытаюсь добавить запись, используя

   var newTag = new JobTag { JobId = job.JobID, Name = "myName", Value = myValueString};
   connect.JobTags.Add(newTag)
   connect.SaveChanges()

Я получаю ошибку

Microsoft.EntityFrameworkCore.DbUpdateException:
Произошла ошибка при обновлении записей. Смотрите подробности во внутреннем исключении.

System.Data.SqlClient.SqlException: преобразование типа данных datetime2 в тип данных datetime привело к значению вне допустимого диапазона

Я не получаю сообщение об ошибке, если инициализирую свойство Created с DateTime.Now.

Если я удаляю свойство из модели, то SQLT DateTime используется правильно.

Зачем мне нужно инициализировать свойство, если оно имеет значение по умолчанию?

1 Ответ

1 голос
/ 21 марта 2019

Нулевые значения могут быть остановлены или разрешены в любом месте, но в базе данных есть последнее слово.

В вашей модели это должно быть DateTime.Now для даты по умолчанию.

Если вы хотите разрешить нулевые значения

Установка DateTime?для типа столбца в модели может решить проблему.Это позволит значению быть нулевым с точки зрения приложения, что, вероятно, происходит до создания записи в базе данных.

public DateTime? Created { get;set;}

Если вы не хотите разрешать пустые значения и хотите гибкостине идентифицируя значение при создании новой записи из приложения

установите для нее значение по умолчанию в вашей модели:

public DateTime Created { get;set;}=DateTime.Now

Проблема

В вашей базе данных вы говорите, что требуется:

[Created] [datetime] NOT NULL,

Но в приложении вы не устанавливаете его.

var newTag = new JobTag { JobId = job.JobID,     Name = "myName", Value = myValueString};  
connect.JobTags.Add(newTag)
connect.SaveChanges()

Проблема в два раза, например, установив:

public DateTime Created { get;set;}

Вы также говорите, что это требуется с точки зрения приложения, так как оно не включает в себя?, означающее, что пустые значения не допускаются, но не имеет значения по умолчанию.

Требование должно совпадать в обоих местах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...