Entity Framework - 无需配置的数据库优先

3
我正在开发一个处理使用EF的现有数据库的类库。 我想避免类库的使用者(.exe或网站)在*.config文件中设置实体连接字符串。我希望在运行时设置连接字符串。
使用Database First方法,如何设置连接字符串?没有构造函数重载可以采用连接字符串,当我创建了一个(在单独的部分类中)时,出现了“UnintentionalCodeFirstException”错误。
我已经查看了以下链接:
- Is there a way to change connection string in database first?。它是关于修改配置文件中的连接字符串,但我想避免这样做,因为它会重新启动进程(对于Web应用程序而言)。 - How can l use Entity Framework without App.config。不好,因为它使用ObjectContext,而我需要在导入数据库时生成上下文。

请查看此帖子:https://dev59.com/smcs5IYBdhLWcg3wk06X - lintmouse
请发布导致异常的代码(编辑您的问题以包含此代码,不要将其作为答案或评论发布)。我假设您正在使用数据库优先方法,并使用代码生成模板生成POCO。 - Erik Funkenbusch
你是否使用了这里描述的方法?http://msdn.microsoft.com/en-US/data/jj206878,包括使用代码生成器选项?它是否创建了一组POCO类,还是一个在.edmx文件下包含所有类的单个文件? - Erik Funkenbusch
1个回答

6

在DbContext上有一个构造函数接受一个DbConnection参数,而你需要使用一个EntityConnection对象:

SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder();

// Set the properties for the data source.
sqlBuilder.DataSource = "server name";
sqlBuilder.InitialCatalog = "database name";
sqlBuilder.IntegratedSecurity = true;

// Build the SqlConnection connection string.
string providerString = sqlBuilder.ToString();

var entityBuilder = new EntityConnectionStringBuilder();

// Initialize the EntityConnectionStringBuilder.
//Set the provider name.
entityBuilder.Provider = "System.Data.SqlClient";

// Set the provider-specific connection string.
entityBuilder.ProviderConnectionString = providerString;

// Set the Metadata location.
entityBuilder.Metadata = @"res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl";

using(var context = new YourDbContext(entityBuilder.ToString())){
    //do stuff here
}

重要的是注意元数据部分 - "Model1" 显然需要替换为您的模型名称。
Ref: http://msdn.microsoft.com/en-us/library/bb738533.aspx 编辑 20/02/2013 22:25
因此,您需要使用局部类扩展已创建的 DbContext 类,以添加一个构造函数来支持上述代码,如下所示:
public partial class YourDbContext
{
    public YourDbContext(string connection) : base(connection) {}
}

这个类需要与由实体框架向导生成的DbContext在同一个命名空间中。


如前所述,如果我这样做,就会出现“UnintentionalCodeFirstException”(可能是因为它是“数据库优先”方法)。 - Felipe Lopez
我理解这段代码,但是正如之前提到的,我没有针对接收连接的上下文进行构造函数重载。难道没有吗...再次说明,我是使用向导和“从数据库生成”创建模型的,这可能是缺少构造函数的原因吗?无论如何,问题仍然存在。我正在使用VS2012,EF 5。 - Felipe Lopez
好的,我在我的答案中添加了一个额外的部分 - 你需要为你的DbContext添加一个部分类,它添加了一个支持这种行为的构造函数。 - Matt Whetton
你能否发布导致异常的代码?我认为这通常涉及延迟执行或类似的内容。你可能需要将DbConnection包装在using语句中,但我不确定。 - Matt Whetton
很可能与我们传递现有连接有关 - 传递true意味着EF应该管理此连接,但显然并没有!我已经进行了另一个修改,希望能解决您的问题。请注意,将使用连接对象替换为实体连接字符串。 - Matt Whetton
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接