实体框架—使用具有不同连接字符串的相同DbContext

时间:2021-11-07 14:42:50

I'm currently trying to use the same DbContext (I have two databases, of identical structure) in my application. I'm not quite sure what I'm doing wrong, but here's my current code - hopefully it should be pretty obvious what I'm trying to do. I'm using EF Database First (which the error at the bottom seems not to suggest).

我目前正在尝试在应用程序中使用相同的DbContext(我有两个具有相同结构的数据库)。我不太确定我做错了什么,但这是我目前的代码——希望我正在尝试做的事情应该是非常明显的。我首先使用的是EF数据库(下面的错误似乎没有提示)。

My context factory code:

我的上下文工厂代码:

public class HOLContextFactory
    {
        public static HOLDbEntities Create()
        {
            return new HOLDbEntities(); // Works
        }

        public static HOLDbQuoteEntities CreateQuote()
        {
            return new HOLDbQuoteEntities(); // Gives error
        }
    }

public partial class HOLDbQuoteEntities : HOLDbEntities
    {
        public HOLDbQuoteEntities()
            : base("HOLDbQuoteEntities") // This should send "HOLDbQuoteEntities" as the base connection string?! 
// Also tried "name=HOLDbQuoteEntities"
            {
            }
        }

Web.config connection strings:

网络。配置连接字符串:

<add name="HOLDbEntities" connectionString="metadata=res://*/HOLDbContext.csdl|res://*/HOLDbContext.ssdl|res://*/HOLDbContext.msl;provider=System.Data.SqlClient;provider connection string=<connstringdetails>" providerName="System.Data.EntityClient" />

<add name="HOLDbQuoteEntities" connectionString="metadata=res://*/HOLDbContext.csdl|res://*/HOLDbContext.ssdl|res://*/HOLDbContext.msl;provider=System.Data.SqlClient;provider connection string=<connstringdetails>" providerName="System.Data.EntityClient" /> // using diff database - same structure

Error I'm getting when using "HOLDbQuoteEntities" :

我在使用“HOLDbQuoteEntities”时得到的错误:

Code generated using the T4 templates for Database First and Model First development may not work correctly if used in Code First mode. To continue using Database First or Model First ensure that the Entity Framework connection string is specified in the config file of executing application. To use these classes, that were generated from Database First or Model First, with Code First add any additional configuration using attributes or the DbModelBuilder API and then remove the code that throws this exception**

如果在代码优先模式中使用T4模板生成的代码,那么在数据库优先和模型优先开发中生成的代码可能不能正常工作。要继续使用数据库,首先要确保在执行应用程序的配置文件中指定了实体框架连接字符串。要使用这些类,首先从数据库或模型生成,代码首先使用属性或DbModelBuilder API添加任何附加配置,然后删除抛出此异常的代码**

2 个解决方案

#1


4  

Entity Framework needs to use the actual entities object:

实体框架需要使用实际的实体对象:

public class HOLContextFactory
{
    public static HOLDbEntities Create()
    {
        // default connection string
        return new HOLDbEntities(); 
    }

    public static HOLDbEntities CreateQuote()
    {
        // specified connection string
        return new HOLDbEntities ("HOLDbQuoteEntities"); 
    }
}

public partial class HOLDbEntities
{
    public HOLDbEntities(string connectionString)
        : base(connectionString) 
        {
        }
    }
}

#2


1  

I've done the same thing in one of my project. I am creating my entity context using metadata=res://*/

我在我的一个项目中也做过同样的事情。我正在使用metadata=res://*/创建我的实体上下文

Try this:

试试这个:

<add name="HOLDbEntities" connectionString="metadata=res://*/;provider=System.Data.SqlClient;provider connection string=<connstringdetails>" providerName="System.Data.EntityClient" />

<add name="HOLDbQuoteEntities" connectionString="metadata=res://*/;provider=System.Data.SqlClient;provider connection string=<connstringdetails>" providerName="System.Data.EntityClient" /> 

#1


4  

Entity Framework needs to use the actual entities object:

实体框架需要使用实际的实体对象:

public class HOLContextFactory
{
    public static HOLDbEntities Create()
    {
        // default connection string
        return new HOLDbEntities(); 
    }

    public static HOLDbEntities CreateQuote()
    {
        // specified connection string
        return new HOLDbEntities ("HOLDbQuoteEntities"); 
    }
}

public partial class HOLDbEntities
{
    public HOLDbEntities(string connectionString)
        : base(connectionString) 
        {
        }
    }
}

#2


1  

I've done the same thing in one of my project. I am creating my entity context using metadata=res://*/

我在我的一个项目中也做过同样的事情。我正在使用metadata=res://*/创建我的实体上下文

Try this:

试试这个:

<add name="HOLDbEntities" connectionString="metadata=res://*/;provider=System.Data.SqlClient;provider connection string=<connstringdetails>" providerName="System.Data.EntityClient" />

<add name="HOLDbQuoteEntities" connectionString="metadata=res://*/;provider=System.Data.SqlClient;provider connection string=<connstringdetails>" providerName="System.Data.EntityClient" />