所以我觉得这很简单,但由于某些原因我无法找到答案。我的问题是我之前使用过从ObjectContext继承的EF 4.3.1上下文,并且自动生成总是创建一个重载的构造函数,它接受连接字符串作为参数。
现在我正在尝试切换到EF 5.0,我必须使用DbContext版本。但是继承自DbContext的MyEntities只有无参数构造函数可用。我想我可以自己添加重载的构造函数,并使其调用base(connectionString),但对自动生成的文件进行手动更改似乎只是一个冒险的业务。
那么如何创建一个使用我在运行时提供的连接字符串的MyEntities实例呢?
答案 0 :(得分:1)
您是否尝试过使用connectionFactory?
此示例适用于SqLite,但它适用于所有数据库。
你可以创建一个类似于这个的类:
public class SqLiteConnectionFactory : IDbConnectionFactory
{
public System.Data.Common.DbConnection CreateConnection(string nameOrConnectionString)
{
var databaseDirectory = @"C:\\master.db";
var builder = new SQLiteConnectionStringBuilder
{
DataSource = databaseDirectory,
Version = 3
};
return new SQLiteConnection(builder.ToString());
}
}
然后在第一次访问上下文之前使用if执行此语句:
Database.DefaultConnectionFactory = new ConnectionFactories.SqLiteConnectionFactory ();
答案 1 :(得分:0)
这是一个构建连接字符串的函数(对于firebird这里):
private static string ConnectionString(string dbFileName)
{
// Specify the provider name, server and database.
const string providerName = "FirebirdSql.Data.FirebirdClient";
const string metaData = "res://*/RcModel.csdl|res://*/RcModel.ssdl|res://*/RcModel.msl";
// Initialize the EntityConnectionStringBuilder.
EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
//Set the provider name.
entityBuilder.Provider = providerName;
FbConnectionStringBuilder sqlBuilder = new FbConnectionStringBuilder();
sqlBuilder.UserID = "sysdba";
sqlBuilder.Password = "masterkey";
sqlBuilder.DataSource = @"127.0.0.1";
sqlBuilder.Database = dbFileName;
sqlBuilder.Dialect = 3;
sqlBuilder.Charset = "UTF8";
sqlBuilder.ServerType = FbServerType.Default;
// Set the provider-specific connection string.
entityBuilder.ProviderConnectionString = sqlBuilder.ConnectionString;
entityBuilder.Metadata = metaData;
return entityBuilder.ToString();
}
以这种方式使用:
string cs = ConnectionString(@"C:\myDbFile.fbd");
EntityConnection conn = new EntityConnection(cs);
MyEntities db = new MyEntities(conn);
答案 2 :(得分:-1)
您可以在创建MyEntities的地方执行此操作。像这样:
MyEntities dataContext = new MyEntities();
dataContext.Database.Connection.ConnectionString = "<YOUR CONNECTION STRING>";
如果您的edmx设置为在配置中查找连接字符串,它仍会在创建时执行此操作,但您可以删除嵌入其中的数据库提供程序连接字符串。执行此操作后,它看起来像这样(如果连接到SQL):
<connectionStrings>
<add name="MyEntities" connectionString="metadata=res://*/MyEntities.csdl|res://*/MyEntities.ssdl|res://*/MyEntities.msl;provider=System.Data.SqlClient;provider connection string=;" providerName="System.Data.EntityClient" />
</connectionStrings>