1

我知道这已经在其他链中得到了一定程度的覆盖,但即使在根据我的需要进行插值之后,我仍然遇到问题。众所周知,文档几乎不存在。因此,非常感谢任何帮助。

我正在尝试创建一个通用方法,它仅从包含 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;
    }
4

0 回答 0