我希望将动态连接字符串传递给实体框架上下文.我有超过150个相同的模式(每个帐户一个),我想选择这样的连接:
ApplicationDbContext db = new ApplicationDbContext("dbName");
Run Code Online (Sandbox Code Playgroud)
理论上这很容易,因为我可以创建一个connectionString并将其作为构造函数的参数传递,例如:
public ApplicationDbContext(string dbName) : base(GetConnectionString(dbName))
{
}
public static string GetConnectionString(string dbName)
{
// The connectionString passed is something like:
// Server=localhost;Database={0};Uid=username;Pwd=password
var connString = ConfigurationManager
.ConnectionStrings["MyDatabase"]
.ConnectionString
.ToString();
return String.Format(connString, dbName);
}
Run Code Online (Sandbox Code Playgroud)
我只是传递连接字符串名称时可以成功连接,但是当我动态生成它时不能如下所示.我现在意识到这是因为web.config中的连接字符串中包含providerName="MySql.Data.MySqlClient"属性.
当我将实际连接字符串动态传递给连接时,它假定它需要连接到SQL Server而不是MySQL,并且由于连接字符串无效而失败.
问题是,如果我动态创建提供者名称,如何将提供者名称传递给连接字符串?
您好我有一个以上的项目连接到CodeFirst Entity Framework的某个数据库.
除了一个顽固的项目外,所有项目都能成功连接.
我得到的错误是: Keyword not supported: 'port'
我查看了无数的stackoverflow问题,mysql论坛,实体框架论坛等,包括:
MappingException Edm.String与SqlServer.varbinary不兼容
我的连接字符串如下所示:
server=myservername;port=3306;uid=myaccount;database=mydb;pwd=mypwd123
我的db.cs文件如下所示:
public partial class MyDB : DbContext
{
public MyDB ()
: base("server=myservername;port=3306;uid=myaccount;database=mydb;pwd=mypwd123")
{
Logger.Trace("test123");
}
public virtual DbSet<MyItem> MyItems {
get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<MyItem>()
.Property(e => e.Content)
.IsUnicode(false);
}
}
Run Code Online (Sandbox Code Playgroud)
当我port:3306从连接字符串中删除时,我得到了这个:
System.Data.Entity.Core.MappingException: Schema specified is not valid. Errors:
(8,12) : error 2019: Member Mapping specified is not valid. The type 'Edm.DateTime[Nullable=False,DefaultValue=,Precision=]' of member 'Time' …
当我将connectionString名称指定为基础构造函数的参数时,以下配置正常工作.因为我希望能够到后来更改默认的供应商无需重新编译,我想将其设置为我app.config而不是,但我不知道什么是,提供一种type供defaultConnectionFactory.
<connectionStrings>
<add name="MySQL" providerName="MySql.Data.MySqlClient" connectionString="SERVER=localhost;DATABASE=abc;UID=root;PASSWORD=;" />
</connectionStrings>
<entityFramework>
<defaultConnectionFactory type="MySql.Data.Entity.MySqlConnectionFactory, EntityFramework"></defaultConnectionFactory>
<providers>
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.8.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider>
</providers>
</entityFramework>
Run Code Online (Sandbox Code Playgroud)
例外:
无法将Database.DefaultConnectionFactory设置为应用程序配置中指定的"MySql.Data.Entity.MySqlConnectionFactory,EntityFramework"类型的实例.请参阅内部异常了解详细信
内部异常(已翻译,VS设置为英语但某些消息仍为我的语言):
无法在程序集"EntityFramework"中加载"MySql.Data.Entity.MySqlConnectionFactory"类型
该文件指出,大会名称冒号后如下,因此,我也试过MySql.Data.Entity.MySqlConnectionFactory, MySql.Data.Entity.EF6,给我这样的例外:
初始化字符串的格式不符合从索引0开始的规范.
我正在使用EF6,MySql.Data和MySql.Data.Entity.EF6 6.8.3.0.