【发布时间】:2021-11-10 03:26:12
【问题描述】:
我正在使用“创建和删除”APIs,因为我的模型经常更改。
模型更改后,我调用dotnet ef database drop,然后在下一次运行时系统调用context.Database.EnsureCreated() 重新创建数据库。我可以在此之前使用context.Database.EnsureDeleted(),但我不想每次都删除/重新创建数据库(它会减慢“内循环”的开发速度,并且会影响我的驱动器)。
曾经有一种简单的方法(在旧 EF 中)以编程方式检测数据库和模型是否不同步。 EF Core 中没有这样的内置功能。有一些方法(e.g.、e.g.),但它们已经使用了几年,不可靠(取决于内部功能)并且适用于旧版本。
在 v5 中是否有稳定的方法(不使用内部组装功能)来执行此操作?
【问题讨论】:
-
您可能会根据
context.Model或context.Model.GetRelationalModel()编写自己的哈希函数。否则,您必须在某处序列化模型并使用IMigrationsModelDiffer,这会创建迁移步骤。自动迁移是一项常用功能 (github.com/dotnet/efcore/issues/6214)。 -
FYI
.EnsureCreated()如果数据库存在但没有表,将创建 scema。不确定删除所有表是否比删除数据库更快。 -
@JeremyLakeman 这是一个有趣(但费力)的想法。该函数为整个模式返回一个字符串,因此我可以使用直接 sql 调用(
ExecuteSqlRaw或其他任何名称)对其进行哈希处理并将其存储在一个特殊的单字段表中。然后在下次运行比较时,如果有变化,请先调用EnsureDeleted。可能会工作!感谢您的宝贵提示! -
实际上,您可能可以散列来自
context.Model.DebugView.LongView的字符串 -
我在
context.ChangeTracker.DebugView.LongView上找到了它。为什么您认为这是更好的选择?
标签: c# entity-framework entity-framework-core ef-core-5.0