Я создал темпоральные таблицы на основе документов Microsoft SQL Создание темпоральной таблицы с таблицей истории по умолчанию.
https://learn.microsoft.com /en-us/sql/relational-databases/tables/creating-a-system-versioned-temporal-table?view=sql-server-ver15#creating-a-temporal-table-with-a-default-history-table
Миграция:
public partial class Temporaltables : Migration
{
List tablesToUpdate = new List
{
"Images",
"Languages",
"Questions",
"Texts",
"Medias",
};
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.Sql($"CREATE SCHEMA History");
foreach (var table in tablesToUpdate)
{
string alterStatement = $@"ALTER TABLE [{table}] ADD SysStartTime datetime2(0) GENERATED ALWAYS AS ROW START HIDDEN
CONSTRAINT DF_{table}_SysStart DEFAULT GETDATE(), SysEndTime datetime2(0) GENERATED ALWAYS AS ROW END HIDDEN
CONSTRAINT DF_{table}_SysEnd DEFAULT CONVERT(datetime2 (0), '9999-12-31 23:59:59'),
PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime)";
migrationBuilder.Sql(alterStatement);
alterStatement = $@"ALTER TABLE [{table}] SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = History.[{table}]));";
migrationBuilder.Sql(alterStatement);
}
}
protected override void Down(MigrationBuilder migrationBuilder)
{
foreach (var table in tablesToUpdate)
{
string alterStatement = $@"ALTER TABLE [{table}] SET (SYSTEM_VERSIONING = OFF);";
migrationBuilder.Sql(alterStatement);
alterStatement = $@"ALTER TABLE [{table}] DROP PERIOD FOR SYSTEM_TIME";
migrationBuilder.Sql(alterStatement);
alterStatement = $@"ALTER TABLE [{table}] DROP DF_{table}_SysStart, DF_{table}_SysEnd";
migrationBuilder.Sql(alterStatement);
alterStatement = $@"ALTER TABLE [{table}] DROP COLUMN SysStartTime, COLUMN SysEndTime";
migrationBuilder.Sql(alterStatement);
alterStatement = $@"DROP TABLE History.[{table}]";
migrationBuilder.Sql(alterStatement);
}
migrationBuilder.Sql($"DROP SCHEMA History");
}
}
Полный пример настройки темпоральных таблиц:
https://stackoverflow.com/a/64244548/3850405
Это работает очень хорошо, но теперь я хочу получить доступ к значению SysStartTime.
Что я пробовал:
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime SysStartTime { get; set; }
ApplicationDbContext.cs:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{...
foreach (var et in modelBuilder.Model.GetEntityTypes())
{
foreach (var prop in et.GetProperties())
{
if (prop.Name == "SysStartTime" || prop.Name == "SysEndTime")
{
prop.ValueGenerated = Microsoft.EntityFrameworkCore.Metadata.ValueGenerated.OnAddOrUpdate;
}
}
}
и
modelBuilder.Entity(e =>
{
e.Property(p => p.SysStartTime).ValueGeneratedOnAddOrUpdate();
});
Каждая миграция приводит к следующему:
migrationBuilder.AddColumn(
name: "SysStartTime",
table: "Questions",
type: "datetime2(0)",
nullable: false,
defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified));
Это, конечно, приводит к следующей ошибке в команде Update-Database:
Имена столбцов в каждая таблица должна быть уникальной. Имя столбца 'SysStartTime' в
таблице '' указано более одного раза.
Я читал оба этих вопроса и, похоже, так и есть. работал в Entity Framework Core 2.2:
Net Core: Entity Framework и временные таблицы SQL Server, автоматическое формирование шаблонов
Entity Framework Core и SQL Server 2016 темпоральные таблицы
Пытался отключить HIDDEN, но не помогло
SQL:
ALTER TABLE [dbo].Questions ALTER COLUMN SysStartTime DROP HIDDEN;
Подробнее здесь: https://stackoverflow.com/questions/646 ... nd-sysendt
Entity Framework Core 3.1 с временными таблицами — доступ к SysStartTime и SysEndTime ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение