【问题标题】:Entity Framework - Database First without config实体框架 - 没有配置的数据库优先
【发布时间】:2013-02-20 15:39:44
【问题描述】:

我正在开发一个使用 EF 处理现有数据库的类库。我想避免类库(和 .exe 或网站)的使用者在 *.config 文件中包含实体连接字符串。我希望连接字符串设置一个运行时。

如何使用 Database First 方法设置连接字符串?没有使用连接字符串的构造函数重载,当我创建一个(在单独的部分类中)时,我得到了“UnintentionalCodeFirstException”。

我已经查看了以下链接:

【问题讨论】:

  • 请发布您正在使用的代码,它会给您异常(编辑您的问题以包含此代码,不要将其作为答案或评论发布)。我假设您使用的是 Database First 方法并使用代码生成模板生成 POCO?
  • 您是否使用了这里描述的方法? msdn.microsoft.com/en-US/data/jj206878 包括使用代码生成器选项?它是创建了一组 POCO 类,还是将所有类都放在 .edmx 文件下的单个文件?

标签: entity-framework entity-framework-5


【解决方案1】:

在 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”显然需要替换为您的模型名称。

参考: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”(可能是因为它是“数据库优先”方法)
  • 我理解代码,但如前所述,对于将接收连接的上下文,我没有这样的构造函数重载。不在那里...再次,我使用向导和“从数据库生成”创建了模型,这可能是缺少构造函数的原因吗?无论如何,问题仍然存在。我正在使用 VS2012,EF 5。
  • 好的,我在我的答案中添加了一个额外的位 - 您基本上需要为您的 DbContext 添加一个部分类,该类添加一个支持此行为的构造函数。
  • 您的解决方案“部分”工作:构造函数按照建议获取连接对象并进行了一些数据访问,然后稍后抛出异常:“已经有一个打开的 DataReader 与此命令关联必须先关闭。”。我了解错误的含义,但不知道要更改什么。特别是因为如果我使用无参数构造,所有数据访问都可以完美运行,没有例外。
  • 您能否发布导致异常的代码 - 我相信这通常与延迟执行或类似的事情有关。您可能需要将 DbConnection 包装在 using 语句中 - 但我不确定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多