We are using EF Core and SQL Server 2016 for our .NET Core Web API. I am evaluating use of temporal tables and its impact on EF Core code. When I generate the EF model using cmdline then it generates model with appstart, append and mappings in dbcontext
. When I do insert/update they fail saying these columns cannot be updated. I had to remove appstart, end from model and dbcontext
mapping to make it work. I read there is no interception capability yet in EF Core like EF 6.x.
Please advise about any better solutions for this.
I tried below options and they are working.
option 1: removed appstart, append fields from entities and dbcontext mappings and updates/insert started working properly.
option 2: decorate period columns with attributes as below.
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime StartTime { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime EndTime { get; set; }
目前没有更好的解决方案,该功能在backlog 中。
Making the Period start column(StartTime) and Period end column(EndTime) hidden should fix this issue. We can do this by
ALTER TABLE [dbo].[Table1] ALTER COLUMN [StartTime] ADD HIDDEN;
ALTER TABLE [dbo].[Table1] ALTER COLUMN [EndTime] ADD HIDDEN;
We can see the settings for hidden against these columns in the sys.columns table
SELECT * FROM sys.columns WHERE is_hidden = 1
I think there's a better solution for this as follows: Create partial context file (to prevent re-making the changes after re-generating the model) as follows
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();
});
}
}
.NET 6 and Entity Framework Core 6.0 supports SQL Server temporal tables out of the box.
See this answer for examples:
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.