C# 实体框架-冗余连接字符串

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

我在我的项目中使用实体框架4。框架已经创建了自己的连接字符串,因此我的
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=&quot;Data Source=localhost;Initial Catalog=VNK;User ID=user;Password=pass;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
我的问题是如何摆脱
VNKEntities
连接字符串,只留下
ApplicationServices
,我将从我的模型中引用它们?我希望只有一个到数据库的连接字符串,因为我只使用一个数据库(将构造函数参数从
name=vnkenties
替换为
name=ApplicationServices
不起作用)

问候

  • 从普通连接字符串手动创建数据库连接
  • 手动创建对象
  • 使用创建
  • 将实体连接传递给ObjectContext构造函数

  • 尽管可以在代码中创建连接,正如@gandjustas所指出的(+1),但您无法摆脱连接字符串或
    EntityConnection


    这是因为它实际上并不是多余的。是的,数据库连接部分是冗余的,@gandjustas向您展示了如何删除冗余。但是,实体框架连接字符串还包含有关模型的信息,在要保留的连接字符串中找不到这些信息。该模型信息必须来自某个地方。如果您删除实体框架的连接字符串并使用
    ObjectContext
    上的参数列表构造函数,您将删除对模型的所有引用。

    我也遇到了同样的问题。我通过以下方式解决了这个问题:

    我创建了两个edmx文件,但在创建第二个edmx文件时,忽略了要保存在配置文件中的连接字符串。这样,我的配置文件将只包含一个连接字符串。 然后,我修改了连接字符串中的以下行:

    <add name="MyDbContext" connectionString="metadata=res://*/;provider=System.Data.SqlClient;provider connection string=&quot;data source=abc;initial catalog=mydb;persist security info=True;user id=myuser;password=password;MultipleActiveResultSets=True;App=EntityFramework&quot;" 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=&quot;data source=abc;initial catalog=mydb;persist security info=True;user id=myuser;password=password;MultipleActiveResultSets=True;App=EntityFramework&quot;" 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>