我知道这已经在其他链中得到了一定程度的覆盖,但即使在根据我的需要进行插值之后,我仍然遇到问题。众所周知,文档几乎不存在。因此,非常感谢任何帮助。
我正在尝试创建一个通用方法,它仅从包含 EF 实体的 DLL 生成一个 DB 脚本。然后,我传递了一个 DLL 路径和 App.config 中定义的连接字符串的名称。第一次通过,脚本生成良好。我在 SQLServer Studio 中运行它并生成所有表等。但是,当我第二次运行它(数据库存在)时,它在 ScriptUpdate 方法上失败,并出现以下错误:
无法为应用程序配置中指定的 DbContext 类型“AdminovateLibrary.Repository.EntityDbContext, Adminovate.AdminovateLibrary-Project”设置“禁用”类型的数据库初始化程序。有关详细信息,请参阅内部异常。
内部异常是:“无法加载文件或程序集'MyLibrary'或其依赖项之一。系统找不到指定的文件。”:“MyLibrary”。
我假设如果 DLL 包含与第一次运行完全相同的代码,则该方法应该产生一个空字符串。但是,即使我使用修改后的 DLL 运行它,它也会给我同样的错误。
我的代码如下:
public string GenerateUpdateSchemaScript( string sourceDllFilePath, string targetConnectionName ) {
var dbMigrationsConfiguration = CreateConfiguration( sourceDllFilePath, targetConnectionName );
var dbMigrator = new DbMigrator( dbMigrationsConfiguration );
Database.SetInitializer( new CreateDatabaseIfNotExists<DbContext>() );
var scriptor = new MigratorScriptingDecorator( dbMigrator );
var script = scriptor.ScriptUpdate( null, null );
return RemoveCreateMigrationHistoryTable( dbMigrationsConfiguration, script );
}
private static DbMigrationsConfiguration CreateConfiguration2( string sourceDllFilePath, string targetConnectionName ) {
var assembly = Assembly.LoadFrom( sourceDllFilePath );
var configType = assembly.GetTypes().Single( type => typeof( DbMigrationsConfiguration ).IsAssignableFrom( type ) );
var configuration = ( DbMigrationsConfiguration )assembly.CreateInstance( configType.FullName );
if( configuration != null ) {
configuration.ContextType = assembly.GetTypes().Single( type => type.BaseType == typeof( DbContext ) );
configuration.MigrationsAssembly = assembly;
configuration.TargetDatabase = new DbConnectionInfo( targetConnectionName );
configuration.AutomaticMigrationsEnabled = true;
configuration.AutomaticMigrationDataLossAllowed = true;
}
return configuration;
}