C# EF6应用程序代码

C# EF6应用程序代码,c#,sql-server,entity-framework-6,C#,Sql Server,Entity Framework 6,我正在迁移到EntityFrameworkV6,我正在努力构建代码,以便在代码中定义SQL 2008R2数据库连接。我无法在app.config文件中存储连接字符串信息,因为此库是多个应用程序将使用的dll。其思想是维护1个dll中的所有数据库连接,而不必在前端引用实体库,也不必指定连接字符串 对于EF5,我能够使用分部类并在DBContext中定义连接字符串,该方法似乎不适用于EF6。我想要一个完全在代码中定义的EF6SQL数据库连接示例。EF6的大多数示例都是针对代码优先模型的,我已经有了数

我正在迁移到EntityFrameworkV6,我正在努力构建代码,以便在代码中定义SQL 2008R2数据库连接。我无法在app.config文件中存储连接字符串信息,因为此库是多个应用程序将使用的dll。其思想是维护1个dll中的所有数据库连接,而不必在前端引用实体库,也不必指定连接字符串

对于EF5,我能够使用分部类并在DBContext中定义连接字符串,该方法似乎不适用于EF6。我想要一个完全在代码中定义的EF6SQL数据库连接示例。EF6的大多数示例都是针对代码优先模型的,我已经有了数据库表,我只需要构建接口


-Hiram

您仍然可以在EF6中的DBContext中定义连接字符串

public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext()
        : base(@"Your connection string here") { }

 // Rest of your DbContext code

}
但是硬编码连接字符串并不是很通用。即使您的
DbContext
将位于它自己的dll中,但如果它位于同一个解决方案中,它仍然可以读取主项目的
app.config
web.config
(我相当肯定,即使您添加
DbContext
dll作为参考,它也会工作)

只需在
DbContext
项目中添加对
System.Configuration
的引用,然后就可以使用
ConfigurationManager.ConnectionStrings[“MyConnectionStringName”].ConnectionString
ConfigurationManager.AppSettings[“MyConnectionStringName”]

您可以将连接字符串存储在
部分的主应用程序
web.config
部分的“app.config”中

请注意,如果您这样做(通过读取
web.config
app.config
),您应该相应地更改
DbContext
代码:

public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext()
        : base("MyConnectionStringName") { }

 // Rest of your DbContext code

}
(假设您使用的是EF设计器)

在使用从EF6设计器生成的代码时,不能只将连接字符串传递给DbContext,因为DbContext需要从EDMX创建的信息。但您仍然可以创建一个分部类,该分部类具有接受连接字符串的构造函数。您只需创建ObjectContext并将其传递给DbContext构造函数

以下是一个例子:

using System.Data.Entity.Core.EntityClient;
using System.Data.Entity.Core.Metadata.Edm;
using System.Data.Entity.Core.Objects;
using System.Data.SqlClient;

namespace Northwind.Model {
    public partial class NorthwindEntities {
        public NorthwindEntities(string connectionString)
            : base(GetObjectContext(connectionString), true) {
        }

        private static ObjectContext GetObjectContext(string connectionString) {
            // You can use the metadata portion of the connection string the the designer added to your config for the paths
            var paths = new[] { 
                "res://*/Northwind.csdl", 
                "res://*/Northwind.ssdl", 
                "res://*/Northwind.msl"
            };

            var workspace = new MetadataWorkspace(paths, new[] { typeof(NorthwindEntities).Assembly });
            var connection = new EntityConnection(workspace, new SqlConnection(connectionString));

            return new ObjectContext(connection);
        }
    }
}

为什么每个应用程序都不能有自己的app.config文件?另外,您是说要在您提到的1个DLL中维护所有数据库连接字符串或连接对象吗?请澄清。场景是这样的:DLL维护到数据库的所有连接。所有连接字符串等等。子应用程序只需调用DLL并将DLL视为黑盒。在当前的开发中,当我使用同一解决方案(或不同的解决方案)中的另一个项目引用DLL时,它会抱怨找不到连接字符串。我认为将连接字符串编码到DLL本身可以消除这种混淆。