如何使实体框架尊重数据库列上默认值的真实性质

时间:2019-06-26 05:00:23

标签: sql-server entity-framework-6

请考虑以下表定义,该表将创建一个表,该表的默认值不可为空,并且在未提供值时具有默认值

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约束,但是实体框架拒绝将生成的值从数据库中拉回。

0 个答案:

没有答案