【问题标题】:Explicit automatic migration with Entity Framework使用实体框架进行显式自动迁移
【发布时间】:2016-04-24 02:35:30
【问题描述】:

所以我已经设法从我的 Entity Framework Code First 模型类创建了一些数据库表。更改这些模型类并再次运行我的代码后,我得到了这个异常:

System.Data.Entity.Migrations.Infrastructure.MigrationsException:目标上下文“...上下文”不可构造。添加默认构造函数或提供 IDbContextFactory 的实现。

不幸的是,数据库连接参数是在运行时确定的,具体取决于用户选择。所以没有默认或静态连接字符串。只能通过代码逻辑建立连接。这是使 EF 为我工作所需的众多技巧之一:

// Manually create database connection because Entity Framework won't let me specify a
// provider name together with a connection string.
// Source: http://stackoverflow.com/a/17403462/143684
var conn = DbProviderFactories.GetFactory("Oracle.ManagedDataAccess.Client").CreateConnection();
conn.ConnectionString = "User Id=" + dbUserName + ";Password=" + dbPassword + ";Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=" + dbHostName + ")(PORT=" + dbPort + "))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=" + dbInstance + ")))";
var appContext = new AppContext(conn);

AppContext(我的DbContext)的唯一构造函数采用DbConnection 参数。 AppContext 的无参数构造函数将不起作用,因为它不知道连接到哪里。然而移民想要我一个。

我在上面显示的代码之前调用它:(Configuration 是 PowerShell 命令为我生成的代码。)

Database.SetInitializer(
    new MigrateDatabaseToLatestVersion<AppContext, Configuration>());

我能否说服 EF 在我为其创建的 AppContext 实例上运行自动迁移?

【问题讨论】:

    标签: c# .net entity-framework


    【解决方案1】:

    您是否尝试过实现IDbContextFactory 接口?

    public class CustomContextFactory : IDbContextFactory<AppContext>
    {
        public AppContext Create()
        {
            return new AppContext(CustomDbConnection);
        }
    
        private DbConnection CustomDbConnection
        {
            get
            {
                // here goes your code to build a DbConnection
            }
        }
    }
    

    【讨论】:

    • 不,相反,我完全放弃了自动迁移,并使用 SQL 脚本和运行时连接配置框架进行了自己的模式版本管理。工作正常,根本不使用 XML 配置文件,而且我确切地知道我的数据库的样子。
    猜你喜欢
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 2015-05-11
    相关资源
    最近更新 更多