【问题标题】:ProviderIncompatibleException when running first time. But, not in second time首次运行时出现 ProviderIncompatibleException。但是,不是第二次
【发布时间】:2015-09-16 14:11:09
【问题描述】:

所以,基本上我在我的项目中使用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(工作正常),然后使用以下方法从connectionString 重写connectionString

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);
    ...
}

【问题讨论】:

  • 在做任何与实体框架相关的事情之前,你会调用你的 WriteConnectionString 吗?也许 EF 只是在您刷新之前读取它?
  • 是的。我也那么认为。我以前什么都做。我不知道该怎么办:/
  • 您的 WriteConnectionString 方法很好,所以问题出在代码的另一部分。尝试在程序的 Main 方法的第一行执行此操作。
  • 我发布了一些代码。如您所见,我循环遍历ProjectMgtContext 中的所有行,然后编写connectionString 以继续该过程。

标签: c# entity-framework ef-code-first connection-string


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢。我没有意识到这一点。我将使用构造函数
猜你喜欢
  • 2016-03-20
  • 2017-09-09
  • 1970-01-01
  • 2017-12-18
  • 2017-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-29
相关资源
最近更新 更多