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

C# 为EF 5.0模型提供连接字符串,c#,entity-framework,dbcontext,C#,Entity Framework,Dbcontext,所以我想这很简单,但由于某种原因我找不到答案。我的问题是,我以前使用过从ObjectContext继承的EF 4.3.1上下文,并且自动生成总是创建一个重载构造函数,该构造函数接受连接字符串作为参数 现在我尝试切换到EF5.0,我必须使用DbContext版本。但是从DbContext继承的MyEntities只有无参数构造函数可用。我想我可以自己添加重载构造函数,并使其成为callbase(connectionString),但对自动生成的文件进行手动更改充其量只是一件冒险的事情 那么,如何创

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

现在我尝试切换到EF5.0,我必须使用DbContext版本。但是从DbContext继承的MyEntities只有无参数构造函数可用。我想我可以自己添加重载构造函数,并使其成为callbase(connectionString),但对自动生成的文件进行手动更改充其量只是一件冒险的事情


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

您尝试过使用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 ();

以下是构建连接字符串的函数(此处为firebird):

这样使用:

        string cs = ConnectionString(@"C:\myDbFile.fbd");
        EntityConnection conn = new EntityConnection(cs);
        MyEntities db = new MyEntities(conn);

你可以在你创建MyEntities的地方做。大概是这样的:

MyEntities dataContext = new MyEntities();

dataContext.Database.Connection.ConnectionString = "<YOUR CONNECTION STRING>";
MyEntities dataContext=newmyentities();
dataContext.Database.Connection.ConnectionString=“”;
如果您的edmx设置为在配置中查找连接字符串,则在创建时仍会这样做,但您可以删除嵌入其中的数据库提供程序连接字符串。完成此操作后,它看起来像这样(如果连接到SQL):



它不是真正的“自动生成”,即使您使用EF Power工具将架构反向工程到类,至少在“EDMX”意义上,当对设计器的任何更改重新创建您的所有类时。现在它只生成一次。理论上,映射和上下文代码都可以手工编写,因此在我看来,您可以自由添加第二个构造函数。这更多的是一种观点而不是答案,也许其他人有更好的想法至少该文件在MyEntities.Context.tt下显示为MyEntities.Context.cs,甚至有注释警告该文件是在文件开头自动生成的,手动更改将被覆盖。啊,所以您使用的是T4生成。那么也许,是的,我真的不能说什么确定的,因为我从来没有使用过T4模板。如果您使用的是纯“代码”版本的映射(不管是代码优先还是数据库优先),那么我认为没有理由不修改它。我认为您可能需要更改t4模板来更改生成的构造函数。看看这个:
MyEntities dataContext = new MyEntities();

dataContext.Database.Connection.ConnectionString = "<YOUR CONNECTION STRING>";
 <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>