我使用MySQL EF 6(MySQL.Data.Entity包)连接MySQL DB。如果我使用构造函数connectionStringName :base("MyContext")
,一切都会好的。但是,如果我直接使用connectionString :base("server=localhost;port=3306;database=wordpress;uid=root")
,它就不起作用。应用程序引发错误System.ArgumentException: Keyword not supported: 'port'.
我的项目需要直接使用连接字符串。有谁知道如何修理它?谢谢
[DbConfigurationType(typeof(MySqlEFConfiguration))]
public class MyContext : DbContext
{
static MyContext()
{
Database.SetInitializer<MyContext>(null);
}
public MyContext()
//:base("server=localhost;port=3306;database=wordpress;uid=root;password=") not work
:base("MyContext") // it worked if using connectionStringName
{
}
}
答案 0 :(得分:3)
目前您正在使用DbContext
构造函数,该构造函数接受来自web.config的连接字符串名称或任何直接分配的连接字符串:
public DbContext(
string nameOrConnectionString
)
后一个参数字符串有一个主要问题,它没有提供任何方法来包含正在使用的数据库提供程序名称(你不能在那里提供providerName
值,即MySql.Data.MySqlClient
),因此EF自动在web.config中由defaultConnectionFactory
定义的选定默认提供程序,如下所示:
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
</entityFramework>
由于默认数据库提供程序仍设置为SQL Server,因此它不会在连接字符串中接受port
作为其关键字,因此抛出ArgumentException
。
要解决此问题,只需change default connection factory to MySql.Data.Entity.MySqlConnectionFactory
,以便MySQL现在设置为传递给DbContext
的所有连接字符串的默认提供程序(假设您使用的是EF 6):
<entityFramework>
<defaultConnectionFactory type="MySql.Data.Entity.MySqlConnectionFactory, MySql.Data.Entity.EF6" />
<providers>
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6"></provider>
</providers>
</entityFramework>
注意:如果您提供存储在web.config中的连接字符串的名称,它将起作用,因为connectionString
元素具有providerName
属性,该属性将传递给EF {{1 }}:
DbContext
类似问题: