我的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。
为什么具有默认值的属性需要初始化?
答案 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;}
您还从应用程序角度说这是必需的,因为它不包含?,表示不允许为空,但没有默认值。
需求在两个地方都必须匹配。