7

我试图为我的问题找到解决方案,但到目前为止我的努力都是徒劳的。:-(

我使用 Visual Studio 2010、.NET Framework 4、C#、Entity Framework 5.0、MySQL 5.5 及其对应的 .NET 连接器(版本 6.5.4)创建了一个 Web 项目。我对实体和 O/R 映射使用代码优先方法。

我面临的问题是我无法执行看似简单的迁移。这是我的实体类:

public class Usuario
{
    public int Id { get; set; }

    [Required]
    [StringLength(100)]
    public string NomeCompleto { get; set; }

    [Required]
    [StringLength(100)]
    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }

    [Required]
    [StringLength(30)]
    public string Login { get; set; }

    [Required]
    [StringLength(64)]
    public string Senha { get; set; }

    [Required]
    public bool Ativo { get; set; }

    //[Timestamp]
    [ConcurrencyCheck]
    public int Versao { get; set; }
}

public class Perfil
{
    public int Id { get; set; }

    [Required]
    [StringLength(50)]
    public string Nome { get; set; }

    [StringLength(100)]
    public string Descricao { get; set; }

    //[Timestamp]
    [ConcurrencyCheck]
    public int Versao { get; set; }

    public virtual ICollection<Usuario> Usuarios { get; set; }
    public virtual ICollection<Permissao> Permissoes { get; set; }
}

public class Permissao
{
    public int Id { get; set; }

    [Required]
    [StringLength(50)]
    public string Nome { get; set; }

    [StringLength(100)]
    public string Descricao { get; set; }

    //[Timestamp]
    [ConcurrencyCheck]
    public int Versao { get; set; }

    public virtual ICollection<Perfil> Perfis { get; set; }
}

Add-Migration Acesso由(唯一Up()方法)生成的代码:

public partial class Acesso : DbMigration
{
    public override void Up()
    {
        CreateTable(
            "dbo.Usuario",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    NomeCompleto = c.String(nullable: false, storeType: "mediumtext"),
                    Email = c.String(nullable: false, storeType: "mediumtext"),
                    Login = c.String(nullable: false, storeType: "mediumtext"),
                    Senha = c.String(nullable: false, storeType: "mediumtext"),
                    Ativo = c.Boolean(nullable: false),
                    Versao = c.Int(nullable: false),
                })
            .PrimaryKey(t => t.Id);

        CreateTable(
            "dbo.Perfil",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    Nome = c.String(nullable: false, storeType: "mediumtext"),
                    Descricao = c.String(storeType: "mediumtext"),
                    Versao = c.Int(nullable: false),
                })
            .PrimaryKey(t => t.Id);

        CreateTable(
            "dbo.Permissao",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    Nome = c.String(nullable: false, storeType: "mediumtext"),
                    Descricao = c.String(storeType: "mediumtext"),
                    Versao = c.Int(nullable: false),
                })
            .PrimaryKey(t => t.Id);

        CreateTable(
            "dbo.PerfilPermissao",
            c => new
                {
                    PerfilId = c.Int(nullable: false),
                    PermissaoId = c.Int(nullable: false),
                })
            .PrimaryKey(t => new { t.PerfilId, t.PermissaoId })
            .ForeignKey("dbo.Perfil", t => t.PerfilId, cascadeDelete: true)
            .ForeignKey("dbo.Permissao", t => t.PermissaoId, cascadeDelete: true)
            .Index(t => t.PerfilId)
            .Index(t => t.PermissaoId);

        CreateTable(
            "dbo.UsuarioPerfil",
            c => new
                {
                    UsuarioId = c.Int(nullable: false),
                    PerfilId = c.Int(nullable: false),
                })
            .PrimaryKey(t => new { t.UsuarioId, t.PerfilId })
            .ForeignKey("dbo.Usuario", t => t.UsuarioId, cascadeDelete: true)
            .ForeignKey("dbo.Perfil", t => t.PerfilId, cascadeDelete: true)
            .Index(t => t.UsuarioId)
            .Index(t => t.PerfilId);

    }
}

首先,我必须将名为 Versao (version) 的属性从

[Timestamp]
public byte[] Versao { get; set; }

[ConcurrencyCheck]
public int Versao { get; set; }

因为在更改之前发生了错误(关于类型 rowversion 的某些事情没有被命名空间或别名限定)。进行此更改后,我能够生成迁移,但Update-Database命令失败,控制台中显示以下错误:

System.FormatException: Cadeia de entrada não estava em um formato incorreto.
    em System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)

(输入字符串的格式不正确。)

我尝试使用 MySQL 5.5 和 5.1 版本;连接器的6.5.4、6.4.5和6.3.9版本并不能解决问题。

是否可以使用 MySQL、实体框架和代码优先方法?如果不是,那么切换到 ODBC 连接器而不是 .NET 的后果是什么?

在此先感谢,并对这个大问题感到抱歉。

4

6 回答 6

22

创建了MySQL Data Connector v.6.6.4 的一个分支,它支持最新版本的 Entity Framework (v.5)。

要使用它,您只需下载二进制文件,它们是MySql.Data和的替换程序集MySql.Data.Entity。还要确保您的项目依赖于 EF5 而不是 4.3。

在您Enable-Migrations第一次之后,修改您的Configuration类的构造函数以包含以下行:

SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator());

此时,您应该能够运行Add-Migration并且Update-Database没有问题。

我的 fork 的主要变化如下:

  • 二进制文件依赖于 EF5 而不是 EF4.3。

  • EF5 会dbo.添加到 MySQL 无法处理的所有表名。因此,我的版本破解了 SQL 迁移生成器以dbo.从表名中去除前缀​​。这一切都假设您没有通过TableAttribute实体类覆盖模式。

  • 它消除了CreatedOnJimi 在他的回答中提到的用法。

于 2012-11-19T23:50:37.040 回答
3

您还应该尝试.NET 连接器 6.6,因为它是第一个声称支持 EF 4.3 的版本(第一个带有迁移的版本)。如果它没有帮助,您应该尝试dotConnect for MySql(至少试用)以查找问题是在 .NET 连接器中还是在 EF 中。ODBC 连接器不适用于 EF。

于 2012-09-12T08:41:24.783 回答
2

我认为 .Net Connector 6.6 不支持代码迁移。我已经试过了,当你运行'Update-Database'时你会得到错误,没有为提供者'MySql.Data.MySqlClient'找到MigrationSqlGenerator。使用目标迁移配置类中的 SetSqlGenerator 方法来注册其他 SQL 生成器。dotConnect for MySql 可能会起作用,因为他们说他们已经添加了迁移支持

于 2012-09-13T17:25:15.747 回答
2

有一些关于如何使用 EF+Connector/Net+EFMigrations 的有用指南。我认为如果您检查它们会有所帮助。最新版本的 Connector/Net (6.6.4) 依赖于 EF 4.3.1 支持 EF 5 的 Connector/Net 版本仍处于代码阶段。

如何使用 EF 迁移和连接器/网络

使用 Connector/Net 6.6 升级到基于代码的迁移 EF 4.3.1

希望这可以帮助!

于 2013-01-14T20:39:52.293 回答
2

我收到以下提到的错误

找不到提供程序“MySql.Data.MySqlClient”的 MigrationSqlGenerator。使用目标迁移配置类中的 SetSqlGenerator 方法来注册其他 SQL 生成器。

并得到了这个声明

SetSqlGenerator("MySql.Data.MySqlClient", new ySql.Data.Entity.MySqlMigrationSqlGenerator());

在此处输入图像描述需要在配置构造函数下设置。

于 2018-02-15T12:44:35.440 回答
0

使用 EF CTP5(又名 4.4.0 版)的问题是 CreatedOn 方法已被弃用(用于在数据库中创建相关表)并且 Connector/Net 6.6 正在尝试迁移该表导致异常。

于 2012-11-01T11:12:33.510 回答