自从Entity Framework Code First可用后,我一直在使用以下方法:
public virtual void CreateDatabase()
{
var dbContext = _dbContextLocator.Current;
dbContext.Database.Delete();
dbContext.Database.Create();
dbContext.Database.Initialize(true);
}
最近,我注意到当dbContext.Database.Create()
被点击时,我得到以下异常:
发生System.Data.SqlServerCe.SqlCeException Message =指定的表不存在。 [__MigrationHistory]
Source = SQL Server Compact ADO.NET数据提供者
错误码= -2147467259
的HResult = -2147217865
NativeError = 0
StackTrace:在System.Data.SqlServerCe.SqlCeCommand.ProcessResults(Int32 hr)
InnerException:
如果我转到Debug - Exceptions并检查Thrown是否存在“Common Language Runtime Exceptions”,这会导致执行停止,并且我得到上述异常。如果我取消选中它,数据库似乎正确创建,但我在输出窗口中得到以下错误语句的四次重复:
System.Data.SqlServerCe.dll中发生'System.Data.SqlServerCe.SqlCeException'类型的第一次机会异常
System.Data.SqlServerCe.dll中发生了'System.Data.SqlServerCe.SqlCeException'类型的第一次机会异常 System.Data.SqlServerCe.Entity.dll中发生了'System.Data.SqlServerCe.SqlCeException'类型的第一次机会异常 System.Data.Entity.dll中发生了'System.Data.EntityCommandExecutionException'类型的第一次机会异常
System.Data.Entity.dll中发生了'System.Data.EntityCommandExecutionException'类型的第一次机会异常
System.Data.Entity.dll中发生了'System.Data.EntityCommandExecutionException'类型的第一次机会异常
在dbContext.Database.Create()
周围放置一个try / catch块无效。
我的目标是创建一个完全空白的数据库,然后手动填充数据。我不希望使用Entity Framework的新迁移功能。
如何消除第一次机会异常?
答案 0 :(得分:5)
我的目标是创建一个完全空白的数据库
假设您指的是具有模型所需的实际架构对象的数据库?
如果是这样,您有两种选择:
1)忽略异常 - 使用SqlCE,EF在创建数据库时在内部使用迁移管道。例外是迁移如何确定__MigrationHistory表的存在的实现细节。
2)使用旧版API - ObjectContext上的数据库创建API使用旧的非迁移代码路径。将DbContext转换为IObjectContextAdapter以获取ObjectContext引用。