TL; DR:
- Добавьте
entity.Property(e => e.Modified).HasComputedColumnSql("GENERATED ALWAYS AS ROW START");
для своего столбца "valid from" в коде OnModelCreating
. - Вам не нужно ничего делать для своего "допустимо для столбца.
Фон:
Я использую .NET Core 2.2 с EntityFrameworkCore 3.0 Preview 6.
Вместо добавления атрибута HIDDEN
к этим столбцам в ответе @ VPP я обнаружил, что добавление HasComputedColumnSql
делает трюк и , это также означает, что EF извлекает столбец после каждого UPDATE
.
Вот мой CREATE TABLE
:
CREATE TABLE [dbo].[Contacts] (
[ContactId] INT NOT NULL IDENTITY,
[TenantId] INT NOT NULL,
[Created] DATETIME2 (7) NOT NULL,
[Modified] DATETIME2 (7) GENERATED ALWAYS AS ROW START NOT NULL,
[ValidTo] DATETIME2 (7) GENERATED ALWAYS AS ROW END NOT NULL CONSTRAINT [DF_Contacts_ValidTo] DEFAULT ('9999-12-31 23:59:59.9999999'),
[Name] NVARCHAR(255) NOT NULL,
[PhoneNumber] NVARCHAR(255) NOT NULL,
[HasAMulletHaircut] BIT NOT NULL,
[ListensToDevo] BIT NOT NULL,
[Status] INT NOT NULL,
CONSTRAINT PK_Contacts PRIMARY KEY ([ContactId], [TenantId]),
CONSTRAINT [FK_Contacts_Tenants] FOREIGN KEY ([TenantId]) REFERENCES dbo.Tenants( TenantId ),
PERIOD FOR SYSTEM_TIME ([Modified], [ValidTo])
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE=[dbo].[Contacts_History], DATA_CONSISTENCY_CHECK=ON));
Вот как выглядит мой код Model Builder (изначально сгенерированный dotnet ef dbcontext scaffold
, с пометками моих модификаций):
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Contact>(entity =>
{
entity.HasKey(e => new { e.ContactId, e.TenantId });
// I added this:
entity.Property(e => e.Modified).HasComputedColumnSql("GENERATED ALWAYS AS ROW START");
// I added this, then commented it out because properties cannot have both `HasComputedColumnSql` and `HasDefaultValueSql`. But it works anyway.
//entity.Property(e => e.ValidTo).HasComputedColumnSql("GENERATED ALWAYS AS ROW END");
entity.Property(e => e.ValidTo).HasDefaultValueSql("('9999-12-31 23:59:59.9999999')");
entity.HasOne(d => d.Tenant)
.WithMany(p => p.Contacts)
.HasForeignKey(d => d.TenantId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK_Contacts_Tenants");
});
Короче:
- Добавьте
entity.Property(e => e.Modified).HasComputedColumnSql("GENERATED ALWAYS AS ROW START");
для своего столбца "valid from". - Вам не нужно ничего делать для своего столбца "valid to".
Я выполнил тесты и INSERT
и UPDATE
операторы работают нормально (обратите внимание, что мой код вообще не изменяет мои свойства «valid from» или «valid to»).
Как упоминалось выше, преимуществоэтот подход заключается в том, что после вызова SaveChanges
/ SaveChangesAsync
EF будет автоматически получать обновленные / новые значения для столбца «valid from».