[英]Entity Framework Core and SQL Server 2016 temporal tables
[英]Net Core: Entity Framework and SQL Server Temporal Tables, Automatic Scaffolding
我們在使用帶有 SQL 服務器臨時 SystemVersioningTables 的 Entity Framework Core 2.2 時遇到問題。
以下解決了 Entity Framework 和系統版本控制列的問題。 entityframework 核心和 sql 2016 時態表
使用該解決方案,Entity Framework Core 2.2 是否可以在 SystemVersioning 列上自動添加DatabaseGeneratedOption.Computed
或OnModelCreating
?
dotnet ef dbcontext scaffold
中是否有命令參數?
我們正在尋找一種在自動數據庫腳手架期間自動添加它的方法。 這樣,我們不必為所有 1000 多個表手動添加它,或者在我們添加新表的任何時候。
公司有很多數據庫。
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
或者
public partial class DatabaseDBContext : DbContext
{
partial void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Table1>(entity =>
{
entity.Property(e => e.StartTime)
.ValueGeneratedOnAddOrUpdate();
entity.Property(e => e.EndTime)
.ValueGeneratedOnAddOrUpdate();
});
}
}
我們正在使用 .NET Core 2.2。
注意:我們不想隱藏 SQL 服務器列,作為文章中的第三個解決方案。
在 OnModelCreating 中,您可以檢查和修改 model。 所以這很簡單:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
foreach (var et in modelBuilder.Model.GetEntityTypes())
{
foreach (var prop in et.GetProperties())
{
if (prop.Name == "StartTime"|| prop.Name == "EndTime")
{
prop.ValueGenerated = Microsoft.EntityFrameworkCore.Metadata.ValueGenerated.OnAddOrUpdate;
}
}
}
}
這適用於 EF Core 3.1。 EF Core 2.2 不受支持。 2.1 是 LTS 分支,3.1 也是。 請參閱https://devblogs.microsoft.com/dotnet/net-core-2-2-will-reach-end-of-life-on-december-23-2019/
.NET 6 和 Entity Framework Core 6.0 支持開箱即用的 SQL 服務器時態表。
用法:
public class Customer
{
public Guid Id { get; set; }
public string Name { get; set; }
public List<Order> Orders { get; set; }
}
public class Order
{
public Guid Id { get; set; }
public DateTime OrderDate { get; set; }
public Product Product { get; set; }
public Customer Customer { get; set; }
}
public class Product
{
public Guid Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
使用 IsTemporal:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder
.Entity<Customer>()
.ToTable("Customers", b => b.IsTemporal());
modelBuilder
.Entity<Product>()
.ToTable("Products", b => b.IsTemporal());
modelBuilder
.Entity<Order>()
.ToTable("Orders", b => b.IsTemporal());
}
查詢歷史數據:
var productSnapshots = context.Products
.TemporalBetween(from, to)
.OrderBy(product => EF.Property<DateTime>(product, "PeriodStart"))
.Where(product => product.Name == productName)
.Select(product =>
new
{
Product = product,
PeriodStart = EF.Property<DateTime>(product, "PeriodStart"),
PeriodEnd = EF.Property<DateTime>(product, "PeriodEnd")
})
.ToList();
查找特定的歷史記錄
var order = context.Orders
.TemporalAsOf(on)
.Include(e => e.Product)
.Include(e => e.Customer)
.Single(order =>
order.Customer.Name == customerName
&& order.OrderDate > on.Date
&& order.OrderDate < on.Date.AddDays(1));
恢復已刪除的數據
var customerDeletedOn = context.Customers
.TemporalAll()
.Where(customer => customer.Name == customerName)
.OrderBy(customer => EF.Property<DateTime>(customer, "PeriodEnd"))
.Select(customer => EF.Property<DateTime>(customer, "PeriodEnd"))
.Last();
var customerAndOrders = context.Customers
.TemporalAsOf(customerDeletedOn.AddMilliseconds(-1))
.Include(e => e.Orders)
.Single();
context.Add(customerAndOrders);
context.SaveChanges();
資料來源:
https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-6.0/plan
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.