2012-09-12 9 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); 

    } 
} 

エラーが変更前の発生しましたので、私は

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

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

からVersao(バージョン)という名前のプロパティを変更しなければならなかったすべてのまず(型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、およびコードの最初のアプローチは可能ですか?そうでない場合、.NETコネクタではなくODBCコネクタに切り替えるとどうなりますか?

ご質問ありがとうございました。

+0

スタックトレースとは何ですか?私はこれがこれではないかと思います:http://entityframework.codeplex.com/workitem/461 – Pawel

答えて

3

.NET Connector 6.6は、EF 4.3(移行の最初のリリース)のサポートを主張する最初のリリースであるため、試してください。問題が.NET ConnectorまたはEFにあるかどうか調べるには、それが役に立たない場合は、dotConnect for MySql(少なくとも試行版)を試してください。 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。組立現場ではアセンブリに言及する必要はありません。 (HRESSULT:0x80131040) –

+0

EFをバージョン4.3.1にダウングレードしました。 :) –

1

.Net Connector 6.6ではコード移行がサポートされていないと思います。私はそれを試しましたが、あなたは 'Update-Database'を実行するときにエラーが発生します プロバイダ 'MySql.Data.MySqlClient'に対してMigrationSqlGeneratorが見つかりませんでした。追加のSQLジェネレータを登録するには、ターゲットの移行構成クラスでSetSqlGeneratorメソッドを使用します。 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です。

これを使用するには、MySql.DataMySql.Data.Entityの置換アセンブリであるdownload the binariesを使用できます。また、プロジェクトが4.3ではなくEF5に依存していることを確認してください。あなたの後

Enable-Migrations最初の時間は、ライン含めるためにあなたのConfigurationクラスのコンストラクタを変更します。この時点で

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

を、あなたは問題なくAdd-MigrationUpdate-Databaseを実行することができます。次のように

私のフォークの主要な変更点は次のとおりです。

  • バイナリがEF5ではなく、EF4.3に依存しています。

  • EF5は、MySQLが処理できないすべてのテーブル名にdbo.を追加します。したがって、私のバージョンでは、テーブル名から接頭辞dbo.を取り除くためにSQL移行ジェネレータをハックします。これはすべて、エンティティクラスのTableAttributeを介してスキーマをオーバーライドしていないことを前提としています。

  • 彼の答えに記載されているように、CreatedOnの使用を削除します。

+0

フォークに感謝します。それは私を動かした。どこで.NET/Connectorのソースコードをforkするのですか?私は別の問題(Unicodeサポート)を無用に修正するためにそれを見つけようとしています。 – sergiopereira

+1

@sergiopereiraには、[zip archive](http://dev.mysql.com/downloads/mirror.php?id=412150)が付属しています。 –

+0

カーク、どこから手に入れましたか?今のところBitbucketでレポをフォークしただけですが、新しいバージョンで再度フォークする必要がある場合は、元のソースがどこにあるかを知ることができればうれしいです。 – sergiopereira

2

EF + Connector/Net + EFMigrationsを使用する方法についていくつかの役に立つ方法があります。あなたがそれらをチェックすると役に立つと思います。 Connector/Net(6.6.4)の最新バージョンはEF 4.3.1に依存EF 5をサポートするConnector/Netバージョンはまだコード段階にあります。

HowTo using EF Migrations and Connector/Net

Upgrading to Code Based Migrations EF 4.3.1 with Connector/Net 6.6

この情報がお役に立てば幸い!

0

私は

ませんMigrationSqlGeneratorは、プロバイダのMySql.Data.MySqlClient "が見つかりたエラー以下になりました。追加のSQLジェネレータを登録するには、ターゲットの移行構成クラスでSetSqlGeneratorメソッドを使用します。

およびコンフィギュレーションのコンストラクタで設定する

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

T enter image description here自分のニーズ、このステートメントを使用して固定してしまいました。