2012-09-12 141 views
7

我试图为我的问题找到解决方案,但直到现在我的努力都是徒劳的。 :-(MySQL 5.5 + .NET连接器+实体框架+迁移= FormatException

我使用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(版本)的属性从

[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,Entity Framework和代码优先的方法?如果没有,切换到ODBC连接器而不是.NET连接器的后果是什么?

在此先感谢您,并对此感到抱歉。

+0

什么是堆栈跟踪?我不知道这是不是这个:http://entityframework.codeplex.com/workitem/461 – Pawel

回答

3

您还应该尝试.NET Connector 6.6,因为它是第一个声明支持EF 4.3(第一个发行版)的版本。如果它不起作用,您应该尝试dotConnect for MySql(至少试用版)以查找问题出在.NET Connector还是EF中。 ODBC连接器不适用于EF。

+0

谢谢!几乎在那里......不幸的是,.NET Connector 6.6依赖于EntityFramework.dll版本= 4.3.1.0,但Entity Framework 5.0 DLL的版本是4.4.0.0。 System.Reflection.TargetInvocationException在我尝试使用较新的连接器运行迁移时发生:System.IO.FileLoadException:请求组件'EntityFramework,Version = 4.3.1.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'ou uma de suasdependências。定义了一个定义的程序集可以执行程序集本地化程序。 (Exceçãode HRESULT:0x80131040) –

+0

我将EF降级到版本4.3.1,它工作正常! :) –

1

我不认为代码迁移是由.Net连接器6.6支持的。我已经尝试过了,运行'Update-Database'时会出现错误, 找不到提供程序'MySql.Data.MySqlClient'的MigrationSqlGenerator。使用目标迁移配置类中的SetSqlGenerator方法来注册其他SQL生成器。 dotConnect for MySql可能会工作,因为他们说他们已经添加了迁移支持

+0

MySqlMigrationSqlGenerator存在于MySql.Data.Entity包中。您必须使用SetMigrationSqlGenerator()手动注册它。你还需要编译。Net Connector 6.6与.NET Framework 4.5,或者你会遇到什么matheus.emm超过 –

0

使用EF CTP5(又名版本4.4.0)的事情是已弃用了CreatedOn方法(用于在DB中创建相关表)并且Connector/Net 6.6正试图迁移该表导致异常。

18

我已经支持最新版本的Entity Framework(v.5)的MySQL Data Connector v.6.6.4的created a fork

要使用它,您可以只需download the binaries,它们是MySql.DataMySql.Data.Entity的替换部件。还要确保你的项目依赖于EF5而不是4.3。

后您Enable-Migrations在第一时间,修改Configuration类的构造函数,包括线路:

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

在这一点上,你应该能够运行Add-MigrationUpdate-Database没有问题。是

我的叉子的主要变化如下:

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

  • EF5将dbo.加到您的所有表名中,MySQL无法处理。因此,我的版本篡改了SQL迁移生成器,从表名中去掉dbo.前缀。这一切都假定您不通过实体类上的TableAttribute覆盖架构。

  • 它删除了Jimi在他的回答中提到的CreatedOn的用法。

+0

谢谢你的叉子。它让我感动。你从哪里得到.NET/Connectctor源代码来分叉?我一直试图找到它来解决另一个问题(Unicode支持)无济于事。 – sergiopereira

+1

@sergiopereira,它附带[zip档案](http://dev.mysql.com/downloads/mirror.php?id=412150)。 –

+0

Kirk,但你从哪里得到它的?现在我只是在Bitbucket上推销你的回购,但如果我需要再次购买它的新版本,那么知道原始资源的位置会很高兴。 – sergiopereira

0

我得到以下提到的错误

没有MigrationSqlGenerator发现提供商 'MySql.Data.MySqlClient'。使用目标迁移配置类中的SetSqlGenerator方法来注册其他SQL生成器。

,并得到了固定,这种说法

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

牛逼enter image description here自己的需求配置下的构造函数中设置。