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

时间:2013-02-26 14:59:54

标签: c# .net entity-framework

我目前正在尝试在我的应用程序中使用相同的DbContext(我有两个相同结构的数据库)。我不太确定我做错了什么,但这是我现在的代码 - 希望我应该很清楚我要做的事情。我正在使用EF Database First(底部的错误似乎没有提示)。

我的上下文工厂代码:

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连接字符串:

<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

使用“HOLDbQuoteEntities”时出错:

  

使用数据库优先和模型的T4模板生成的代码   如果在Code First模式下使用,则第一次开发可能无法正常工作。   要继续使用Database First或Model First,请确保实体   框架连接字符串在配置文件中指定   执行申请。要使用这些类,请从中生成   数据库优先或模型优先,使用代码优先添加任何其他   然后使用属性或DbModelBuilder API进行配置   删除抛出此异常的代码**

2 个答案:

答案 0 :(得分:4)

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

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) 
        {
        }
    }
}

答案 1 :(得分:1)

我在我的一个项目中做了同样的事情。我正在使用metadata=res://*/

创建我的实体上下文

试试这个:

<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" />