实体框架,多个edmx共享连接字符串-有可能吗?

Pau*_*aul 5 wcf entity-framework connection-string edmx wcf-data-services

我看到了许多相关的问题,但这些问题都不是我要找的。

我们正在使用一个数据库,并且需要使用不同的Model和ObjectContext类名称分离edmx文件。这导致具有多个连接字符串,仅在元数据部分不同。

现在我结束了:

Web.config

<connectionStrings configSource="connectionStrings.config"></connectionStrings>
Run Code Online (Sandbox Code Playgroud)

connectionStrings.config

<connectionStrings> 

<add name="Entities" connectionString="metadata=res://*/Entity.Model.csdl|
res://*/Entity.Model.ssdl|res://*/Entity.Model.msl;
provider=CONNECTION STRING DATA GOES HERE"/> 

<add name="TwoEntities" connectionString="metadata=res://*/TwoEntity.TwoModel.csdl|
res://*/TwoEntity.TwoModel.ssdl|res://*/TwoEntity.TwoModel.msl;
provider=EXACTLY THE SAME CONNECTION STRING DATA GOES HERE"/> 

</connectionStrings> 
Run Code Online (Sandbox Code Playgroud)

在我的ObjectContext派生类中,我确实具有默认生成的构造函数:

public Entities()
            : base("name=Entities", "Entities")
{
}
Run Code Online (Sandbox Code Playgroud)

public TwoEntities()
            : base("name=TwoEntities", "TwoEntities")
{
}
Run Code Online (Sandbox Code Playgroud)

最好不要在.config文件中有两个连接字符串,而是从该文件共享相同的连接字符串,并以某种方式在每个类中覆盖它的元数据部分。

有关如何执行此操作的任何建议?

Lad*_*nka 5

是的,可以,但是您不能从配置中使用EF连接字符串。您必须在应用程序中手动构建连接字符串。ObjectContext支持多个重载的构造函数。一种是接受EntityConnection。可以从MetadataWorkspace(从EF元数据文件创建的类)和构造EntityConnection DbConnection。您可以将自定义工厂方法添加到派生上下文中,该方法将在共享数据库连接字符串的基础上进行构建MetadataWorkspaceDbConnection从中传递它们EntityConnection

public static Entities GetContext(string connenctionString) 
{
    MetadataWorkspace workspace = GetWorkspace(); // This should handle workspace retrieval
    DbConnection connection = new SqlConnection(connectionString); // Connection must not be openned
    EntityConnection entConnection = new EntityConnection(workspace, entConnection);
    return new Entities(entConnection);
}

private Entities(EntityConnextion entConnection) : base(entConnection)
{  } 
Run Code Online (Sandbox Code Playgroud)

您将使用此工厂方法而不是构造函数。确保每个元数据集仅GetWorkspace创建MetadataWorkspace一次,并在应用程序的生命周期内将其内部存储。它的创建非常耗时。