我知道在其他链条中已经覆盖了一些,但即使根据我的需要进行插值,我仍然遇到问题。很多人都知道文档几乎不存在。因此,非常感谢任何帮助。
我正在尝试创建一个通用方法,它只从包含EF实体的DLL生成数据库脚本。然后,我传递一个DLL路径和App.config中定义的连接字符串的名称。第一次通过,脚本生成正常。我在SQLServer Studio中运行它并生成所有表等。但是,当我第二次运行它(DB存在)时,它在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;
}