我正在迁移到Entity Framework v6,我正在努力构建代码,让我在代码中定义我的SQL 2008R2数据库连接。我无法在app.config文件中存储连接字符串信息,因为这个库是多个应用程序将使用的DLL。我们的想法是在1 dll内维护所有数据库连接,而不必引用前端的实体库,也不必指定连接字符串。
使用EF5,我能够使用部分类并在DBContext中定义连接字符串,该方法似乎不适用于EF6。我想要一个在代码中完全定义的EF6 SQL数据库连接的示例。 EF6的大多数示例都是代码优先模型,我已经有了数据库表,我只需要构建接口。
-Hiram
答案 0 :(得分:1)
您仍然可以在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作为参考,也会有效。
只需在System.Configuration
项目中添加对DbContext
的引用,然后您就可以使用ConfigurationManager.ConnectionStrings["MyConnectionStringName"].ConnectionString
或ConfigurationManager.AppSettings["MyConnectionStringName"]
您可以将连接字符串存储在web.config
部分的主要应用<connectionStrings>
或<appSettings>
部分的'app.config'中
请注意,如果您这样做(通过阅读web.config
或app.config
),则应相应更改DbContext
代码:
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext()
: base("MyConnectionStringName") { }
// Rest of your DbContext code
}
答案 1 :(得分:1)
(假设您使用的是EF Designer)
使用从EF6 Designer生成的代码时,不能只将连接字符串传递给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);
}
}
}