2015-04-16 37 views
1

我试图将我的EF6配置从myexe.exe.config转换为代码,作为empty DbProviderFactories node in machine.config组织的解决方法(此处描述为:https://stackoverflow.com/a/24273922/600559)。我不想更改machine.config文件。我已阅读Code-Based Configuration (EF6 onwards)EF6/SQL Server Compact,基于代码的配置

我试过这样的实现: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 -file的system.dataentityFramework节点被删除。

现在这个工作,但是machine.config文件读取:如果在machine.config<DbProviderFactories/>我得到这个异常:

Exception

所以,真正的问题不在于基于代码的配置不起作用,问题在于machine.config配置仍在读取并导致问题。任何人都知道如何解决此问题?

+0

请拓展:不工作,或无人可以帮你。配置代码是否未被调用,或者您是否收到错误? – ErikEJ

+0

@ErikEJ我已添加更多信息 - 顺便说一句,我是你工作的忠实粉丝 –

回答

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; 
    } 
    } 
+1

这不是一个可靠的解决方案。使用我的EntityFramework.SqlServerCompact.PrivateDeployment NuGet包,这将为您节省一些代码来维护并且健壮 - 使用当前的解决方案,如果目标PC上的GAC中安装了4.0运行时的不同版本,您将遇到运行时错误,因为ADO.NET提供程序(System.Data.SqlServerCe.dll)的版本将尝试加载错误版本的非托管dll文件。 – ErikEJ

+0

@ErikEJ - 感谢您的评论。我正在阅读您的博客文章http://erikej.blogspot.dk/2013/11/entity-framework-6-sql-server-compact-4_25.html,我越来越害怕。我已经看到SqlCE的私有部署非常简单 - 从未考虑过G​​AC冲突。我将看看EntityFramework.SqlServerCompact.PrivateDeployment。 –

+0

谢谢,Morten。重要的职位实际上是http://erikej.blogspot.dk/2014/10/entity-framework-6-and-sql-server.html – ErikEJ

相关问题