【问题标题】:MySQL and Entity Framework issuesMySQL 和实体框架问题
【发布时间】:2016-01-11 01:47:22
【问题描述】:

我正在尝试使用 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?

【问题讨论】:

  • 您没有将连接信息传递给您的 webinarListDbContext,只是将字符串“MonkeyFist”传递给 DbContext("string")。这将自动创建一个名为“MonkeyFist”的本地数据库。
  • dev.mysql.com/doc/connector-net/en/… ;您需要将连接对象传递给您的上下文,而不是“MonkeyFist”。
  • @Brino,我在该示例中尝试了相同的代码,结果相同。
  • 改成了这个,它打开了但什么也没返回,即使结果查询确实如此,using (webinarListDbContext context = new webinarListDbContext(connectionString))
  • 好的,我终于搞定了,发布为答案以获得接受。

标签: mysql entity-framework


【解决方案1】:

您看到此行为的原因是您实际上并未将连接对象传递给您的上下文。相反,您传递的是字符串“MonkeyFist”,上下文假定它是数据库的名称。由于它在你的配置文件中找不到这个数据库,它会创建一个同名的本地数据库。

请看这里:https://msdn.microsoft.com/en-us/library/system.data.entity.dbcontext(v=vs.113).aspx

如果从派生上下文调用无参数 DbContext 构造函数,则派生上下文的名称用于在 app.config 或 web.config 文件中查找连接字符串。如果未找到连接字符串,则将该名称传递给在 Database 类上注册的 DefaultConnectionFactory。然后,连接工厂使用上下文名称作为默认连接字符串中的数据库名称。 (此默认连接字符串指向本地计算机上的 .\SQLEXPRESS,除非注册了不同的 DefaultConnectionFactory。)除了使用派生的上下文名称外,还可以通过将名称传递给 DbContext 构造函数之一来显式指定连接/数据库名称这需要一个字符串。

将您的连接对象传递给您的上下文。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多