第一次 运行 时出现 ProviderIncompatibleException。但是,不是第二次

ProviderIncompatibleException when running first time. But, not in second time

所以,基本上我在我的项目中使用 EFReverse POCO Code First Generator

我的连接字符串如下所示:

<connectionStrings>
    <add name="HistoryDBContext" connectionString="" providerName="System.Data.SqlClient" />
    <add name="ProjectMgtContext" connectionString="data source=xxx;initial catalog=xxx;user id=xx;password=xxx;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
</connectionStrings>

我的想法是,我将从 ProjectMgtContext 读取 HistoryDBContextconnectionString(工作正常),然后重写 connectionStringHistoryDBContext 使用:

public static void WriteConnectionString(string connectionString)
{
    var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

    var connectionStringsSection = (ConnectionStringsSection) config.GetSection("connectionStrings");

    connectionStringsSection.ConnectionStrings["HistoryDBContext"].ConnectionString = connectionString;

    config.Save();

    ConfigurationManager.RefreshSection("connectionStrings");
}

但是,这仅适用于我 运行 我的项目的 second time,因为在第一个 运行 期间,它抱怨 connectionString 是空的:

所以,显然我的方法是行不通的。我该如何处理?

谢谢

编辑

更多代码:

while (ProjectManager.HaveProjects())
{
    var project = ProjectManager.GetNextProject();

    if (project == null) continue;

    /*Write the current project to the configuration file*/
    Connection.WriteConnectionString(project.ConnectionString);
    ...
}

很可能这种方式行不通。 EF 可能不会在每次需要时都从配置中重新读取您的连接字符串。它也可以在内存中缓存整个配置或仅缓存连接字符串。 App.config 适用于在应用程序运行期间不经常更改(或根本不更改)的连接字符串。只需将连接字符串直接传递给您的 ProjectMgtContext,或者这样做:

public partial class ProjectMgtContext : DbContext {
    public static string DefaultConnectionString;
    public TestEntities()
        : base(DefaultConnectionString)
    {
 }

然后更新 DefaultConnectionString 静态 属性。如果您从模板生成上下文 - 如上所述编辑模板以添加默认连接字符串。