实体框架核心插入不遵守默认值

时间:2019-03-21 01:26:17

标签: entity-framework-core

我的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属性,我不会收到错误消息。

如果我从模型中删除该属性,则可以正确使用SQL Server DateTime。

为什么具有默认值的属性需要初始化?

1 个答案:

答案 0 :(得分:1)

可以在任一位置停止或允许空值,但是数据库拥有最终决定权。

在您的模型中,它应该是DateTime。现在是默认日期。

如果您确实希望允许空值

放置DateTime吗?模型中的列类型可能会解决此问题。从应用程序角度来看,这将使该值为null,这很可能在数据库中创建记录之前发生。

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

您还从应用程序角度说这是必需的,因为它不包含?,表示不允许为空,但没有默认值。

需求在两个地方都必须匹配。