实体框架核心3.1脚手架生成HIDDEN列



我有一个使用时态表的表。我已经将[ValidFromUtc]和[ValidTillUtc]标记为HIDDEN,因此当我使用实体框架构建表时,它不会在实体中生成这些属性。

CREATE TABLE [User].[User](
[Username] [varchar](10) NOT NULL,
[FirstName] [nvarchar](55) NULL,
[LastName] [nvarchar](55) NULL,
[EmailAddress] [varchar](55) NULL,
[IsActive] [bit] NULL,
[ValidFromUtc] [datetime2](7) GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
[ValidTillUtc] [datetime2](7) GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
[ModifiedBy] [nvarchar](128) NOT NULL,
[CreateSid] [nvarchar](128) NOT NULL,
[LastSid]  AS (suser_sname()),
CONSTRAINT [User_pk] PRIMARY KEY CLUSTERED 
(
[Username] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = ON, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY],
PERIOD FOR SYSTEM_TIME ([ValidFromUtc], [ValidTillUtc])
) ON [PRIMARY]
WITH
(
SYSTEM_VERSIONING = ON ( HISTORY_TABLE = [User].[UserHistory] )
)
GO
ALTER TABLE [User].[User] ADD  CONSTRAINT [DF__User_ValidFromUtc]  DEFAULT (sysutcdatetime()) FOR [ValidFromUtc]
GO
ALTER TABLE [User].[User] ADD  CONSTRAINT [DF__User_ValidTillUtc]  DEFAULT ('9999-12-31 23:59:59.9999999') FOR [ValidTillUtc]
GO
ALTER TABLE [User].[User] ADD  CONSTRAINT [DF__User_ModifiedBy]  DEFAULT (suser_sname()) FOR [ModifiedBy]
GO
ALTER TABLE [User].[User] ADD  CONSTRAINT [DF__User_CreateSid]  DEFAULT (suser_sname()) FOR [CreateSid]
GO

当从数据库表脚手架(没有隐藏列(时,这在ef core 2.1中运行良好:

modelBuilder.Entity<User>(entity =>
{
entity.HasKey(e => e.Username)
.HasName("User_pk");
entity.ToTable("User", "User");
entity.Property(e => e.Username)
.HasMaxLength(10)
.IsUnicode(false)
.ValueGeneratedNever();
entity.Property(e => e.CreateSid)
.IsRequired()
.HasMaxLength(128)
.HasDefaultValueSql("(suser_sname())");
entity.Property(e => e.EmailAddress)
.HasMaxLength(55)
.IsUnicode(false);
entity.Property(e => e.FirstName).HasMaxLength(55);
entity.Property(e => e.LastName).HasMaxLength(55);
entity.Property(e => e.LastSid)
.HasMaxLength(128)
.HasComputedColumnSql("(suser_sname())");
entity.Property(e => e.ModifiedBy)
.IsRequired()
.HasMaxLength(128)
.HasDefaultValueSql("(suser_sname())");
});

但现在我已经更新到ef核心3.1,它将这些列添加到实体中,并为它们提供值。

modelBuilder.Entity<User>(entity =>
{
entity.HasKey(e => e.Username)
.HasName("User_pk");
entity.ToTable("User", "User");
entity.Property(e => e.Username)
.HasMaxLength(10)
.IsUnicode(false);
entity.Property(e => e.CreateSid)
.IsRequired()
.HasMaxLength(128)
.HasDefaultValueSql("(suser_sname())");
entity.Property(e => e.EmailAddress)
.HasMaxLength(55)
.IsUnicode(false);
entity.Property(e => e.FirstName).HasMaxLength(55);
entity.Property(e => e.LastName).HasMaxLength(55);
entity.Property(e => e.LastSid)
.HasMaxLength(128)
.HasComputedColumnSql("(suser_sname())");
entity.Property(e => e.ModifiedBy)
.IsRequired()
.HasMaxLength(128)
.HasDefaultValueSql("(suser_sname())");
entity.Property(e => e.ValidFromUtc).HasDefaultValueSql("(sysutcdatetime())");
entity.Property(e => e.ValidTillUtc).HasDefaultValueSql("('9999-12-31 23:59:59.9999999')");
});

我已经回顾了ef核心2.1到3.1的突破性变化,但我没有看到任何提及。

有人知道这一变化的任何信息吗?或者为什么它现在忽略了HIDDEN属性。

为了得出这个结论,我发现当兼容级别等于或大于130时,3.1不会构建隐藏字段。

在实体框架2.1中,它检查服务器版本(等于或大于13(,而不是兼容性级别。

在我们的案例中,我们运行的是Sql Server 2016(版本13(,但兼容性级别较低(120(。一旦我们将兼容性级别更新到130,隐藏字段就不再是脚手架。

这些差异可以在efCore git repo中的以下文件中看到:

efCore 2.1(第538行(https://github.com/dotnet/efcore/blob/release/2.1/src/EFCore.SqlServer/Scaffolding/Internal/SqlServerDatabaseModelFactory.cs

efCore 3.1(第621行(https://github.com/dotnet/efcore/blob/release/3.1/src/EFCore.SqlServer/Scaffolding/Internal/SqlServerDatabaseModelFactory.cs

最新更新