为EF 5.0模型提供连接字符串

时间:2012-08-24 11:53:20

标签: c# entity-framework dbcontext

所以我觉得这很简单,但由于某些原因我无法找到答案。我的问题是我之前使用过从ObjectContext继承的EF 4.3.1上下文,并且自动生成总是创建一个重载的构造函数,它接受连接字符串作为参数。

现在我正在尝试切换到EF 5.0,我必须使用DbContext版本。但是继承自DbContext的MyEntities只有无参数构造函数可用。我想我可以自己添加重载的构造函数,并使其调用base(connectionString),但对自动生成的文件进行手动更改似乎只是一个冒险的业务。

那么如何创建一个使用我在运行时提供的连接字符串的MyEntities实例呢?

3 个答案:

答案 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>