首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >EF6和多个配置(SQL Server和SQL Server Compact)

EF6和多个配置(SQL Server和SQL Server Compact)
EN

Stack Overflow用户
提问于 2013-12-03 22:39:20
回答 3查看 20.9K关注 0票数 23

更新:问题已解决,请参阅此问题的结尾。

The problem

我们正在尝试在一个场景中使用Entity Framework6和基于代码的配置,该场景是在同一个AppDomain中同时使用SQL Server和SQL Server CE。

这个相当简单的场景似乎不受“设计”的支持。来自EF团队:

注意:我们不支持在同一个AppDomain中使用多个配置类。如果使用此属性为两个上下文设置不同的配置类,将抛出异常。

更多信息请点击此处:Code-based Configuration (Codeplex)

question

从现在开始,我们该如何前进?任何帮助都将不胜感激!是否有更灵活的方式将配置连接到上下文而不是AppDomain

(我们的上下文类位于不同的程序集中。我们已经尝试了DbConfigurationType属性,但问题出在EF本身)

配置文件:

普通SQL server的配置

代码语言:javascript
复制
public class EfConfiguration : DbConfiguration
{
    public EfConfiguration()
    {
        SetProviderServices(
            SqlProviderServices.ProviderInvariantName, 
            SqlProviderServices.Instance);

        SetDefaultConnectionFactory(new SqlConnectionFactory());
    }
}

SQL Server Compact Edition的配置

代码语言:javascript
复制
public class EfCeConfiguration : DbConfiguration
{
    public EfCeConfiguration()
    {
        SetProviderServices(
            SqlCeProviderServices.ProviderInvariantName,
            SqlCeProviderServices.Instance);

        SetDefaultConnectionFactory(
            new SqlCeConnectionFactory(SqlCeProviderServices.ProviderInvariantName));
    }
}

更新:

我们得到的错误是:

System.TypeInitializationException:'MyProject.Repositories.Base.DataContext‘的类型初始值设定项引发异常。-> System.InvalidOperationException :设置了“”EfCeConfiguration“”的实例,但在与“”DataContext“”上下文相同的程序集中未发现此类型。“”将DbConfiguration类型放在与DbContext类型相同的程序集中,对DbContext类型使用DbConfigurationTypeAttribute来指定DbConfiguration类型,或者在配置文件中设置DbConfiguration类型。有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=260883

如上所述,更新2,解决方案,我们只能有一个配置。这是一个问题,因为Sql和SqlCe使用不同的提供程序。如果我们使用"SetDefaultConnectionFactory“来适应一种类型的数据库,那么另一种类型的数据库就会失败。

相反,将连接提供到上下文中,如下面标记为answer的帖子中所述。一旦您始终使用连接初始化上下文,而不是使用连接字符串,您就可以开始工作了。您可以从配置中删除SetDefaultConnectionFactory调用。我们只使用下面的代码来配置SqlCe上下文,而不配置Sql上下文。

代码语言:javascript
复制
  public class CommonEfConfiguration : DbConfiguration
    {
        public CommonEfConfiguration()
        {
            // EF does not know if the ce provider by default,
            // therefore it is required to be informed about it.
            // The connection factories are not necessary since the connection
            // is always created in the UnitOfWork classes
            SetProviderServices(SqlCeProviderServices.ProviderInvariantName, SqlCeProviderServices.Instance);
        }
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-03 22:56:25

编辑:基于错误详细信息:您是否已经尝试告诉EF在哪里可以找到配置类?

代码语言:javascript
复制
[DbConfigurationType("MyNamespace.MyDbConfiguration, MyAssemblyFullyQualifiedName")]
public class MyContextContext : DbContext
{
}

如果不能使其工作,请参阅替代方案

将上下文与构造函数DbConnection一起使用

代码语言:javascript
复制
public class MYDbContext : DbContext {
     // MIgration parameterless constructor is managed in  MyMigrationsContextFactory 

    public MyDbContext(string connectionName) : base(connectionName) { } // no this

    public MYDbContext(DbConnection dbConnection, bool contextOwnsConnection)  // THIS ONE
        : base(dbConnection, contextOwnsConnection) {  }

然后,您需要为每个提供程序提供一个"DBConnection“连接。对于SQL server

代码语言:javascript
复制
      public DbConnection GetSqlConn4DbName(string dataSource, string dbName) {
        var sqlConnStringBuilder = new SqlConnectionStringBuilder();
        sqlConnStringBuilder.DataSource = String.IsNullOrEmpty(dataSource) ? DefaultDataSource : dataSource;
        sqlConnStringBuilder.IntegratedSecurity = true;
        sqlConnStringBuilder.MultipleActiveResultSets = true;

        var sqlConnFact = new SqlConnectionFactory(sqlConnStringBuilder.ConnectionString);
        var sqlConn = sqlConnFact.CreateConnection(dbName);
        return sqlConn;
    }

对SqlCe工厂重复上述操作,它也可以生成DBConnection SqlCe connection factor create connection

票数 13
EN

Stack Overflow用户

发布于 2014-02-27 07:48:33

我做了什么:

代码语言:javascript
复制
public partial class MyDataBaseContext : DbContext
{
    public MyDataBaseContext (string ConnectionString)
        : base(ConnectionString)
    {
    }
}
票数 2
EN

Stack Overflow用户

发布于 2017-03-21 22:51:25

我在a post on a Microsoft forum post中找到了解决方案。

基本上,我有两个项目,每个项目都有自己的上下文。实体框架只加载(第一个)一个DbConfiguration类,并尝试对两个项目使用相同的配置。这就是错误消息的原因,如下所示

“已设置'EfCeConfiguration‘的实例,但在与'DataContext’上下文相同的程序集中未发现此类型”。

因此,正如that Microsoft forum post中有人建议的那样,我从两个项目中从继承自DbContext的类中删除了所有[DbConfigurationType(typeof(DbConfigurationClass))] anotations,并且错误不再发生。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20354083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档