【问题标题】:EF6/SQL Server Compact, code-based configurationEF6/SQL Server Compact,基于代码的配置
【发布时间】:2015-04-21 21:57:02
【问题描述】:

我正在尝试将我的 EF6 配置从 myexe.exe.config 移动到代码,作为 empty DbProviderFactories node in machine.config 问题的解决方法(此处描述:https://stackoverflow.com/a/24273922/600559)。我不想更改machine.config 文件。

我已阅读Code-Based Configuration (EF6 onwards)

我已经尝试过这样的实现:https://stackoverflow.com/a/23130602/600559,但是我无法让它工作。有没有人有一个有效的 EF6/SQL CE/基于代码的配置解决方案?

这是我的更改(从有效的 .config 解决方案到基于代码的解决方案): 添加了新类:

public class DatabaseConfiguration : DbConfiguration
{
    public DatabaseConfiguration()
    {
        SetExecutionStrategy("System.Data.SqlServerCe.4.0", () => new DefaultExecutionStrategy());
        SetProviderFactory("System.Data.SqlServerCe.4.0", new SqlCeProviderFactory());
        SetProviderServices("System.Data.SqlServerCe.4.0", SqlCeProviderServices.Instance);
    }
}

然后删除.config-文件中的system.dataentityFramework 节点。

现在可以了,但是读取了machine.config 文件:如果在machine.config 中有<DbProviderFactories/>,我会收到此异常:

所以真正的问题不是基于代码的配置不起作用,问题是machine.config 配置仍在被读取并导致问题。有谁知道如何解决这个问题?

【问题讨论】:

  • 请扩展:不起作用,或者没有人可以帮助您。是没有调用配置代码,还是报错?
  • @ErikEJ 我添加了更多信息 - 顺便说一句,我是你作品的忠实粉丝

标签: c# entity-framework .net-4.0 sql-server-ce


【解决方案1】:

找到了解决办法。实现一个不从machine.config 文件中读取的IDbProviderFactoryResolver

  public class CodeBasedDatabaseConfiguration : DbConfiguration
  {
    public CodeBasedDatabaseConfiguration()
    {
      SetExecutionStrategy("System.Data.SqlServerCe.4.0", () => new DefaultExecutionStrategy());
      SetProviderFactory("System.Data.SqlServerCe.4.0", new SqlCeProviderFactory());
      SetProviderServices("System.Data.SqlServerCe.4.0", SqlCeProviderServices.Instance);
      SetProviderFactoryResolver(new CodeBasedDbProviderFactoryResolver());
    }
  }

  internal class CodeBasedDbProviderFactoryResolver : IDbProviderFactoryResolver
  {
    private readonly DbProviderFactory sqlServerCeDbProviderFactory = new SqlCeProviderFactory();

    public DbProviderFactory ResolveProviderFactory(DbConnection connection)
    {
      var connectionType = connection.GetType();
      var assembly = connectionType.Assembly;
      if (assembly.FullName.Contains("System.Data.SqlServerCe"))
      {
        return sqlServerCeDbProviderFactory;
      }
      if (assembly.FullName.Contains("EntityFramework"))
      {
        return EntityProviderFactory.Instance;
      }
      return null;
    }
  }

【讨论】:

  • 这不是一个可靠的解决方案。使用我的 EntityFramework.SqlServerCompact.PrivateDeployment NuGet 包,这将为您节省一些代码来维护,并且是健壮的 - 如果在目标 PC 上的 GAC 中安装了不同版本的 4.0 运行时,您将遇到运行时错误,因为 ADO.NET 提供程序 (System.Data.SqlServerCe.dll) 的版本将尝试加载错误版本的非托管 dll 文件。
  • @ErikEJ - 感谢您的 cmets。我正在阅读您的博文erikej.blogspot.dk/2013/11/…,我开始害怕了。我已经看到 SqlCE 的私有部署非常简单——从没想过 GAC 冲突。我将看看 EntityFramework.SqlServerCompact.PrivateDeployment。
  • 谢谢,莫腾。重要的帖子其实是erikej.blogspot.dk/2014/10/…
  • @ErikEJ - 我的错 - 我的意思是 erikej.blogspot.dk/2014/10/… 帖子
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-29
相关资源
最近更新 更多