如何使用MigratorScriptingDecorator.ScriptUpdate

时间:2013-11-06 02:31:55

标签: entity-framework

我知道在其他链条中已经覆盖了一些,但即使根据我的需要进行插值,我仍然遇到问题。很多人都知道文档几乎不存在。因此,非常感谢任何帮助。

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

0 个答案:

没有答案