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

3

我想这是非常简单的问题,但出于某种原因我找不到答案。我的问题是,我之前使用的EF 4.3.1上下文继承自ObjectContext,并且自动生成了一个接受连接字符串作为参数的重载构造函数。

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

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


即使您使用EF Power Tools将模式反向工程成类,它也不是真正的“自动生成”,至少不是以“EDMX”的意义,因为任何对设计师的更改都会重新创建所有类。现在它只生成一次。理论上,映射和上下文代码可以全部手写,所以我认为您可以自由添加第二个构造函数。这更多的是一个看法而不是一个答案,也许其他人有更好的想法。 :) - Patryk Ćwiek
至少文件在MyEntities.Context.tt下显示为MyEntities.Context.cs,甚至在文件开头有注释警告该文件是自动生成的,并且手动更改将被覆盖。 - bobblez
啊,所以你正在使用T4生成。那么也许,是的,我不能说出任何明确的东西,因为我从未使用过T4模板。如果您正在使用映射的纯“代码”版本(无论是Code-First还是Database-First都无所谓),那么我认为没有理由不进行修改。 - Patryk Ćwiek
我认为你可能需要更改t4模板以更改生成的构造函数。看看这个:http://stackoverflow.com/questions/5226368/get-entity-framework-connection-string-from-alternate-location - prashanth
3个回答

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());
       }
}

然后在您第一次访问上下文之前执行此语句以使用它:

Database.DefaultConnectionFactory = new ConnectionFactories.SqLiteConnectionFactory ();

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);

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

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