Ядро entityframework и временные таблицы sql 2016
Мы используем efcore и sql 2016 для нашего.net core web api. Я оцениваю использование временных таблиц и их влияние на код efcore. когда я генерирую модель ef, используя строку cmd, он генерирует модель с appstart, append и mappings в dbcontext. когда я делаю вставку / обновление, они терпят неудачу, говоря, что эти столбцы не могут быть обновлены. Мне пришлось удалить appstart, end из модели и отображение dbcontext, чтобы это работало. Я читал, что в efcore, как ef6.x, пока нет возможности перехвата. пожалуйста, посоветуйте лучшее решение для этого.
5 ответов
Я попробовал ниже варианты, и они работают.
вариант 1: удалено приложение, добавлены поля из сущностей и сопоставления dbcontext, а обновления / вставки начали работать правильно.
вариант 2: украсить столбцы периода с атрибутами, как показано ниже.
[DatabaseGenerated (DatabaseGeneratedOption.Computed)] public DateTime StartTime {get; задавать; }
[DatabaseGenerated (DatabaseGeneratedOption.Computed)] public DateTime EndTime {get; задавать; }
В настоящее время нет лучшего решения для этого, и эта функция находится в бэклоге https://github.com/aspnet/EntityFramework/issues/2229
Я думаю, что для этого есть лучшее решение: создать частичный файл контекста (чтобы предотвратить повторное внесение изменений после повторного создания модели) следующим образом
public partial class DatabaseDBContext : DbContext
{
partial void OnModelCreatingPartial(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Table1>(entity =>
{
entity.Property(e => e.StartTime)
.ValueGeneratedOnAddOrUpdate();
entity.Property(e => e.EndTime)
.ValueGeneratedOnAddOrUpdate();
});
}
}
Устранение этой проблемы должно быть сделано путем скрытия столбца начала периода (StartTime) и столбца конца периода (EndTime). Мы можем сделать это
ALTER TABLE [dbo].[Table1] ALTER COLUMN [StartTime] ADD HIDDEN;
ALTER TABLE [dbo].[Table1] ALTER COLUMN [EndTime] ADD HIDDEN;
Мы можем видеть настройки скрытых для этих столбцов в таблице sys.columns
SELECT * FROM sys.columns WHERE is_hidden = 1
.NET 6 и Entity Framework Core 6.0 поддерживают временные таблицы SQL Server по умолчанию.
См. этот ответ для примеров: