令我惊讶的是,使用CreateDatabaseIfNotExists上下文初始化程序后,该行代码
context.Database.Initialize(true)
如果模式与我的Code First模式不匹配,EF不会抛出异常。
是否有一种方法可以在尝试访问实体之前验证当前数据库是否与我们的模式匹配,例如,表不再存在于数据库中,EF会抛出异常?
令我惊讶的是,使用CreateDatabaseIfNotExists上下文初始化程序后,该行代码
context.Database.Initialize(true)
如果模式与我的Code First模式不匹配,EF不会抛出异常。
是否有一种方法可以在尝试访问实体之前验证当前数据库是否与我们的模式匹配,例如,表不再存在于数据库中,EF会抛出异常?
您可以调用CompatibleWithModel方法来确定数据库是否与模型匹配。如果将参数设置为true,则如果在数据库中未找到模型数据,它将引发异常。
bool isCompatible = context.Database.CompatibleWithModel(true);
每次启动应用程序时,EF 不会将数据库模式与模型进行交叉检查。相反,它会寻找保存在数据库中的模型(__MigrationsHistory 表和 EdmMetadata 之前)并将此已保存的模型与您正在使用的模型进行比较。如果模型匹配,则使用数据库。如果模型不匹配,则会抛出异常。如果您的数据库既没有 __MigrationHistory 表也没有 EdmMetadata 表,则 EF 将默认您正在使用 DbContext 的基于数据库优先的方法,并且您的数据库与模型匹配。如果要将数据库与模型进行比较,可以对模型进行 Edmx 转储(使用 EdmxWriter.WriteEdmx),然后使用 Visual Studio 和 EF 设计器从数据库获取 Edmx 并比较 SSDL 部分。
FileNotFoundException
比由于找不到文件而导致代码继续执行的NullReferenceException
更有用。 - Matt Arnold