C# 实体框架-冗余连接字符串
我在我的项目中使用实体框架4。框架已经创建了自己的连接字符串,因此我的C# 实体框架-冗余连接字符串,c#,.net,entity-framework,configuration,ado.net,C#,.net,Entity Framework,Configuration,Ado.net,我在我的项目中使用实体框架4。框架已经创建了自己的连接字符串,因此我的web.configConnectionString部分文件如下所示: <connectionStrings> <add name="ApplicationServices" connectionString="data source=localhost;user id=user;pwd=pass;initial catalog=VNK" providerName="System.Data.Sql
web.config
ConnectionString部分文件如下所示:
<connectionStrings>
<add name="ApplicationServices" connectionString="data source=localhost;user id=user;pwd=pass;initial catalog=VNK" providerName="System.Data.SqlClient" />
<add name="VNKEntities" connectionString="metadata=res://*/VNKModel.csdl|res://*/VNKModel.ssdl|res://*/VNKModel.msl;provider=System.Data.SqlClient;provider connection string="Data Source=localhost;Initial Catalog=VNK;User ID=user;Password=pass;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
</connectionStrings>
我的问题是如何摆脱VNKEntities
连接字符串,只留下ApplicationServices
,我将从我的模型中引用它们?我希望只有一个到数据库的连接字符串,因为我只使用一个数据库(将构造函数参数从name=vnkenties
替换为name=ApplicationServices
不起作用)
问候
尽管可以在代码中创建连接,正如@gandjustas所指出的(+1),但您无法摆脱连接字符串或
EntityConnection
这是因为它实际上并不是多余的。是的,数据库连接部分是冗余的,@gandjustas向您展示了如何删除冗余。但是,实体框架连接字符串还包含有关模型的信息,在要保留的连接字符串中找不到这些信息。该模型信息必须来自某个地方。如果您删除实体框架的连接字符串并使用
ObjectContext
上的参数列表构造函数,您将删除对模型的所有引用。我也遇到了同样的问题。我通过以下方式解决了这个问题:
我创建了两个edmx文件,但在创建第二个edmx文件时,忽略了要保存在配置文件中的连接字符串。这样,我的配置文件将只包含一个连接字符串。
然后,我修改了连接字符串中的以下行:
<add name="MyDbContext" connectionString="metadata=res://*/;provider=System.Data.SqlClient;provider connection string="data source=abc;initial catalog=mydb;persist security info=True;user id=myuser;password=password;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
<connectionStrings>
<add name="ApplicationServices" connectionString="data source=localhost;user id=user;pwd=pass;initial catalog=VNK;Pooling=False;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
</connectionStrings>
注意:我使用的是Entity Framework 5.0。我将提供解决此问题的完整实现(基于gandjustas提示)。我为上下文编写了一个简单的包装器,可按以下方式使用:
using (var wrapper = new ContextWrapper<VNKEntities>())
{
// do your stuff based on wrapper.Context
}
您可以看到名为EntityConnectionManager的自定义类的用法:
internal class EntityConnectionManager : IDisposable
{
private DbConnection _connection;
private EntityConnection _entityConnection;
private volatile bool _disposed;
public EntityConnectionManager()
{
var workspace = new MetadataWorkspace(Setting.MetadataWorkspacePaths.Split('|'), new[] { Assembly.ReflectionOnlyLoad(Setting.MetadataAssemblyNameToConsider) });
_connection = new SqlConnection(Setting.ConnectionString);
_entityConnection = new EntityConnection(workspace, _connection);
_disposed = false;
}
public EntityConnection Connection
{
get { return _entityConnection; }
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
if (_connection != null)
{
_connection.Dispose();
_connection = null;
}
if (_entityConnection != null)
{
_entityConnection.Dispose();
_entityConnection = null;
}
}
}
_disposed = true;
}
}
现在您可以有一个连接字符串:
<add name="MyDbContext" connectionString="metadata=res://*/;provider=System.Data.SqlClient;provider connection string="data source=abc;initial catalog=mydb;persist security info=True;user id=myuser;password=password;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
<connectionStrings>
<add name="ApplicationServices" connectionString="data source=localhost;user id=user;pwd=pass;initial catalog=VNK;Pooling=False;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
</connectionStrings>
和应用程序设置部分中定义的元数据(域模型实际存储的程序集的第二个关键点):
类型设置的逻辑很简单,因为它只是从配置文件中提取设置。感谢您的详细解释,这帮助我理解为什么我应该选择@gandjustas给出的解决方案来解决我的问题。
<connectionStrings>
<add name="ApplicationServices" connectionString="data source=localhost;user id=user;pwd=pass;initial catalog=VNK;Pooling=False;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
</connectionStrings>
<appSettings>
<add key="MetadataWorkspacePaths" value="res://*/VNKModel.csdl|res://*/VNKModel.ssdl|res://*/VNKModel.msl" />
<add key="MetadataAssemblyNameToConsider" value="VNK.Models" />
</appSettings>