c# - Entity Framework Core 3.1 脚手架生成隐藏列
问题描述
我有这张使用时态表的表。我已将 [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 core 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 core 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
推荐阅读
- wordpress - 使用 slug 作为 url 参数创建从附件目录到 index.php 的重定向
- azure-functions - 如何告诉 Azure 函数队列触发器不要重试消息
- android - Phonegap 构建错误:任务“:transformClassesWithDexForRelease”执行失败
- database - 加速 ETL 转换 - Pentaho Kettle
- view - 如何默认隐藏背面 v2 中的文件树窗格并为代码和 pdf 视图设置默认宽度?
- apache-kafka - 用于事件过滤的 Kafka Consumer API 与 Streams API
- hibernate - 在多对一关系中获取具有空值的数据
- cordova - 离子科尔多瓦相机不可用
- google-chrome - Chrome DevTools 协议:瀑布图
- javascript - Javascript - 呈现输入字段文本