MySQL数据提供程序未在实体数据模型向导中显示

8
我正在使用MySQL作为后端创建一个MVC应用程序。我计划使用Entity Framework来处理这个数据库。我已经有了一个数据库,所以需要从数据库生成模型。
环境: MySQL Server 5.7.21 MySQL for Visual Studio 1.27 Connector/NET 6.10.5 Visual Studio 2015
重现问题的步骤: 1. 添加新项目 "Ado.net Entity Data Model" 2. 选择 "EF Designer from database" 并点击 "下一步" 3. 点击 "新建连接"
没有mysql连接器可用。
其他细节: 1. 当安装Mysql.data.ef6时出现错误时,我已经添加了 "System.Runtime" 包。 2. 我在 "System.Data" 的程序集引用中更改了 "CopyLocal=true"。 3. 我在Visual Studio 2017中尝试了相同的步骤。在第三步中,我可以看到提供程序,但是单击确定后对话框关闭而不是显示表列表。 在Visual Studio 2015和17中,初次运行时会显示提供程序。当我再次尝试时,它就不再显示了。 请帮忙解决。我已经检查了两天了。

根据我的经验( https://stackoverflow.com/questions/48397483/mysql-database-provider-for-ef-6 ),MySQL数据提供程序目前的状态并不适合用于生产代码。 - Robin B
3个回答

2
要开始使用VS 2013和EF 6,请按照以下步骤操作:
  1. 安装MySQL for Visual Studio 1.1.1
  2. 安装Connector/Net 6.8.1产品。
  3. 如果要使用“数据库优先”方法,请执行以下操作:
    • 为名为MySql.Data.Entity.EF6的新程序集添加引用,并将其复制到应用程序的bin文件夹中。
    • 在Entity Framework部分的提供程序上添加下面一行:
    • 在运行向导之前,请编译应用程序,以便应用新更改。
  4. 如果要使用“模型优先”方法,请执行以下操作:
    • 为名为MySql.Data.Entity.EF6的新程序集添加引用,并将其复制到应用程序的bin文件夹中。
    • 添加ADO.Net Entity Model(新建或现有)。
    • 选择与MySQL对应的T4模板(SSDLToMySQL)。
    • 右键单击模型,然后选择生成脚本以创建数据库(应该会为您生成一个MySQL脚本来创建数据库)。
希望这能有所帮助。 MySQL for Visual Studio 1.1.1下载链接 MySQL Connector/Net 6.8.1 Beta下载链接

0
如MaDOS所述,mySql并没有真正得到支持。如果您仍想使用EF,则必须进行代码优先尝试。
您需要编写映射类,并告诉EF它不应更改该数据库。

使用已禁用的db更改的示例上下文

public class MySqlDbContext : DbContext
{
    public DbSet<MyOrderClass> Orders { get; set; }

    public MySqlDbContext(IDbConnection connection)
        : base((DbConnection)connection, false)
    {
        Database.SetInitializer<MySqlDbContext>(null); // Disable db-changes by dbContext
    }
}

你的主要问题在于数据类型。在微软以外的世界中,并非所有的数据类型都被支持(Oracle 也有一些关于 DateTime 的问题)。在下面的示例类中,“Created”列被处理为字符串,这总是有效的。在你的 .Net 应用程序中,你需要实现“转换器”属性,将其映射到所需的类型。

带有映射配置的示例类

[Table("TORDERS")]
public class MyOrderClass
{
    [Column("ORDERID")]
    public long Id { get; set; }
    [Column("CREATED")]
    public string CreatedString { get; set; }

    [NotMapped]
    public DateTime? Created
    {
        get
        {
            DateTime tmp;
            if (DateTime.TryParse(this.CreatedString, out tmp))
                return tmp;

            return null;
        }
        set
        {
            this.CreatedString = value.HasValue ? value.Value.ToString("yyyy-MM-dd HH:mm:ss") : null;
        }
    }
}


    static void Main(params string[] args)
    {
        MyOrderClass tmp = new MyOrderClass() { CreatedString = "2018-01-01 11:11:11"};

        Console.WriteLine(tmp.Created.ToString()); // This is how you want to work
        tmp.Created = null;
        Console.WriteLine(tmp.CreatedString); // this is surely not what you want to do

        tmp.Created = new DateTime(2018,02,02,10,10,10);
        Console.WriteLine(tmp.CreatedString); // Check if setter works ;)
    }

我不知道哪些类型适用,但使用这个方法,您将始终能够使用EF。 我们曾经使用它来访问现有的数据库,该数据库的架构非常糟糕,因此我们必须设置数据类型。


0

这可能是一个32位与64位的问题吗?
例如:安装了64位驱动程序,但Visual Studio是32位的吗?
我在使用oledb连接Informix时总是遇到这个问题。你的软件在64位环境下可以完美运行,但工具却是32位的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接