请考虑以下表定义,该表将创建一个表,该表的默认值不可为空,并且在未提供值时具有默认值
drop table [defaultTest]
CREATE TABLE [defaultTest](
[TestId] [int] IDENTITY(1,1) NOT NULL,
[TestData] [nvarchar](100) NOT NULL,
[TestKey] [int] NOT NULL,
[TestTimeStamp] [datetimeoffset](7) NOT NULL,
PRIMARY KEY CLUSTERED
(
[TestId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [defaultTest] ADD CONSTRAINT [DF_Test_TestKey] DEFAULT (NEXT VALUE FOR [SomeSequence]) FOR [TestKey]
GO
ALTER TABLE [defaultTest] ADD CONSTRAINT [DF_Test_TestTimeStamp] DEFAULT (sysdatetimeoffset()) FOR [TestTimeStamp]
GO
CREATE UNIQUE NONCLUSTERED INDEX [defaultTest_TestKey_Insert_UK] ON [defaultTest]
(
[TestKey] ASC,
[TestTimeStamp] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
declare @testkey int;
declare @id int;
insert into [defaultTest]([TestData]) values ('Original');
set @id = @@IDENTITY;
select @testkey = [TestKey] from [defaultTest] where [TestId] = @id;
insert into [defaultTest]([TestData], [TestKey] ) values ('Updated', @testkey);
select * from [defaultTest];
TestId TestData TestKey TestTimeStamp
1 Original 27 2019-06-26 14:40:22.1042605 +10:00
2 Updated 27 2019-06-26 14:40:22.1062673 +10:00
在数据库中,它可以完美运行。插入项可以提供值,也可以不提供值,数据库将确保值始终存在。
但是当首先在实体框架数据库中引用此数据库表时,我正在努力使实体框架尊重实际情况。
观察到的行为是,如果StoredGeneratedPattern = none,并且字段为空,则始终传递零值;如果StoredGeneratedPattern = Compute(或Identity),则字段始终传递null。如果提供了值。
这不是定义在数据库级别上的工作方式,所以为什么以这种方式编写实体框架是一个谜?
是否有一种方法可以使实体框架在这种情况下正常运行?
编辑:我尝试从Key中删除not null约束,但是实体框架拒绝将生成的值从数据库中拉回。