我正在尝试使用EF6连接到MySql数据库。我看了很多例子,看起来都不一样。我看到了很多不同的方式,它们不像是我经历过的Oracle连接。
public string GetWebinarList()
{
string str = "";
string connectionString = "server=127.0.0.1;port=3306;UserId=user;database=db;password=pwd;CharSet=utf8;Persist Security Info=True;";
using (MySqlConnection connection = new MySqlConnection(connectionString))
{
connection.Open();
using (webinarListDbContext context = new webinarListDbContext())
{
var list = context.WebinarLists.ToString();
str = list;
}
connection.Close();
}
return str;
}
以上实际上看起来更像是通过ADO.DB连接而不是EF6。
上下文定义:
[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
public class webinarListDbContext : DbContext
{
public webinarListDbContext() : this("MonkeyFist") { }
public webinarListDbContext(string connStringName) : base(connStringName) { }
static webinarListDbContext()
{
// static constructors are guaranteed to only fire once per application.
// I do this here instead of App_Start so I can avoid including EF
// in my MVC project (I use UnitOfWork/Repository pattern instead)
DbConfiguration.SetConfiguration(new MySql.Data.Entity.MySqlEFConfiguration());
}
public DbSet<WebinarList> WebinarLists { get; set; }
}
Web.Config中:
<system.data>
<DbProviderFactories>
<remove invariant="MySql.Data.MySqlClient" />
<add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.9.8.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
</DbProviderFactories>
<connectionStrings>
<add name="MonkeyFist" providerName="MySql.Data.MySqlClient" connectionString="server=127.0.0.1;port=3306;UserId=user;database=db;password=pwd;CharSet=utf8;Persist Security Info=True;"/>
</connectionStrings>
</system.data>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.8.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
</providers>
</entityFramework>
但这是我在检查上下文对象时看到的:
使用SQLClient连接和MySQLClient有什么关系?为什么要将MonkeyFist设置为数据库?我如何将EF6连接到MySQL?
答案 0 :(得分:0)
您看到此行为的原因是您实际上没有将连接对象传递给您的上下文。而是传递字符串&#34; MonkeyFist&#34;,上下文假设是db的名称。由于它无法在配置文件中找到此db,因此它会创建一个具有相同名称的本地数据库。
见这里:https://msdn.microsoft.com/en-us/library/system.data.entity.dbcontext(v=vs.113).aspx
如果从派生上下文调用无参数DbContext构造函数,则派生上下文的名称用于在app.config或web.config文件中查找连接字符串。如果未找到连接字符串,则将名称传递给在Database类上注册的DefaultConnectionFactory。然后,连接工厂将上下文名称用作默认连接字符串中的数据库名称。 (除非注册了不同的DefaultConnectionFactory,否则此默认连接字符串指向本地计算机上的。\ SQLEXPRESS。)除了使用派生的上下文名称,还可以通过将名称传递给DbContext构造函数之一来显式指定连接/数据库名称。需要一个字符串。
将您的连接对象传递给您的上下文。