Рассмотрим следующее определение таблицы, которое создает таблицу со значениями по умолчанию, которые не могут иметь значение NULL, и которые имеют значения по умолчанию для случаев, когда значение не указано
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 = нет, а поля пусты, а всегда пропускает ноль, если StoredGeneratedPattern = Computed (или Identity), даже если значение предоставляется.
Это не то, как определение когда-либо работает на уровне базы данных, так почему структура сущностей была запрограммирована таким образом, является загадкой?
Есть ли способ заставить структуру сущностей вести себя правильно для этого сценария?
РЕДАКТИРОВАТЬ: я попытался удалить ограничение не пустое из ключа, но структура сущностей отказывается извлекать сгенерированное значение обратно из базы данных.