3

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

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

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

4

3 回答 3

1

您是否尝试过使用连接工厂?

此示例适用于 SqlLite,但它适用于所有数据库。

你可以创建一个类似于这个的类:

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 ();
于 2012-09-02T12:35:51.797 回答
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);
于 2012-11-20T14:09:58.733 回答
-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>
于 2013-03-01T20:56:47.117 回答