在 EF Core 5 中检测模型和数据库是否不同步
Detect whether model and database out of sync in EF Core 5
我正在使用“创建和删除”APIs,因为我的模型经常变化。
模型更改后,我调用 dotnet ef database drop
,接下来 运行 系统调用 context.Database.EnsureCreated()
重新创建数据库。我可以在 context.Database.EnsureDeleted()
之前使用 drop/recreate 数据库 每 一次(它减慢了开发“内部循环”,并且它'我会敲打我的驱动器)。
曾经有一种简单的方法(在旧 EF 中)以编程方式检测数据库和模型是否不同步。 EF Core 中没有这样的内置功能。有一些方法 (, ) 但它们已经有几年历史了,不可靠(取决于内部功能)并且适用于旧版本。
在 v5 中是否有稳定的方法 - 不使用内部汇编功能 - 做到这一点?
您可以使用 .Model.DebugView.LongView
.
让 EF Core 将您的架构 (context.Model
) 序列化为字符串
然后我会根据该字符串计算哈希值,并将该哈希值与存储在 table.
中的值进行比较
因为 EF Core 不会向 运行 公开原始 select 查询的方法,特别是如果您不能依赖最新的架构。您可能需要直接使用 SqlConnection
来查询 table.
或者将您的比较构造为 insert
/ update
语句,以便您可以根据受影响的行数决定要做什么。由于您要立即销毁数据库,因此可以忽略 sql 的副作用。
我正在使用“创建和删除”APIs,因为我的模型经常变化。
模型更改后,我调用 dotnet ef database drop
,接下来 运行 系统调用 context.Database.EnsureCreated()
重新创建数据库。我可以在 context.Database.EnsureDeleted()
之前使用 drop/recreate 数据库 每 一次(它减慢了开发“内部循环”,并且它'我会敲打我的驱动器)。
曾经有一种简单的方法(在旧 EF 中)以编程方式检测数据库和模型是否不同步。 EF Core 中没有这样的内置功能。有一些方法 (
在 v5 中是否有稳定的方法 - 不使用内部汇编功能 - 做到这一点?
您可以使用 .Model.DebugView.LongView
.
context.Model
) 序列化为字符串
然后我会根据该字符串计算哈希值,并将该哈希值与存储在 table.
中的值进行比较因为 EF Core 不会向 运行 公开原始 select 查询的方法,特别是如果您不能依赖最新的架构。您可能需要直接使用 SqlConnection
来查询 table.
或者将您的比较构造为 insert
/ update
语句,以便您可以根据受影响的行数决定要做什么。由于您要立即销毁数据库,因此可以忽略 sql 的副作用。