我看到了许多相关的问题,但没有一个是我正在寻找的。 p>
我们正在使用一个数据库,需要使用不同的Model和ObjectContext类名来分隔edmx文件。这导致具有多个连接字符串,这些字符串仅在元数据部分中不同。
现在我最终这样做了:
的Web.config
<connectionStrings configSource="connectionStrings.config"></connectionStrings>
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>
在我的ObjectContext派生类中,我确实有默认生成的构造函数:
public Entities()
: base("name=Entities", "Entities")
{
}
和
public TwoEntities()
: base("name=TwoEntities", "TwoEntities")
{
}
什么是非常好的不是在.config文件中有两个连接字符串,但是从该文件共享相同的连接,并以某种方式覆盖每个类中的元数据部分。
有关如何执行此操作的任何建议吗?
答案 0 :(得分:4)
是的,但是您无法使用配置中的EF连接字符串。您必须在应用程序中手动构建连接字符串。 ObjectContext
支持多个重载的构造函数。其中一个是接受EntityConnection
。反过来,EntityConnection可以从MetadataWorkspace
(从EF元数据文件创建的类)和DbConnection
构建。您可以将自定义工厂方法添加到派生上下文中,该上下文将从共享数据库连接字符串构建MetadataWorkspace
和DbConnection
,并在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)
{ }
您将使用此工厂方法而不是构造函数。确保GetWorkspace
每个元数据集只创建一次MetadataWorkspace
,并在应用程序的生命周期内将其存储在内部。它的创建非常耗时。