7

私は自分の問題の解決策を見つけようとしましたが、今までの努力は無駄でした. :-(

Visual Studio 2010、.NET Framework 4、C#、Entity Framework 5.0、MySQL 5.5 を使用して Web プロジェクトを作成しました。これは、対応する .NET コネクタ (バージョン 6.5.4) です。エンティティと 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、およびコード ファースト アプローチを使用することは可能ですか? そうでない場合、.NET コネクタではなく ODBC コネクタに切り替えると、どのような結果が生じますか?

事前に感謝し、大きな質問について申し訳ありません.

4

6 に答える 6

22

Entity Framework (v.5) の最新バージョンをサポートする MySQL Data Connector v.6.6.4 のフォークを 作成しました。

これを使用するには、およびの代替アセンブリであるバイナリをダウンロードするだけです。また、プロジェクトが 4.3 ではなく EF5 に依存していることを確認してください。MySql.DataMySql.Data.Entity

Enable-Migrations初めて行った後、Configurationクラスのコンストラクターを変更して次の行を含めます。

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

Add-Migrationこの時点で、Update-Database問題なく 実行できるはずです。

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

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

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

  • CreatedOnジミが回答で述べたように、の使用法を削除します。

于 2012-11-19T23:50:37.040 に答える
3

また、EF 4.3 のサポートを主張する最初のリリース (移行を伴う最初のリリース) であるため、.NET Connector 6.6も試す必要があります。問題が解決しない場合は、 dotConnect for MySqlを試して(少なくとも試用)、問題が .NET コネクタにあるのか EF にあるのかを確認してください。ODBC コネクタは EF では機能しません。

于 2012-09-12T08:41:24.783 に答える
2

Code Migration は .Net Connector 6.6 ではサポートされていないと思います。'Update-Database' No MigrationSqlGenerator found for provider 'MySql.Data.MySqlClient' を実行すると、エラーが表示されます。ターゲット移行構成クラスで SetSqlGenerator メソッドを使用して、追加の SQL ジェネレーターを登録します。彼らが言うように、MySql の dotConnect は、移行サポートを追加したと言うように機能する可能性があります。

于 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 の使用方法

コードベースの移行 EF 4.3.1 と Connector/Net 6.6 へのアップグレード

お役に立てれば!

于 2013-01-14T20:39:52.293 に答える
0

EF CTP5 (別名バージョン 4.4.0) を使用すると、CreatedOn メソッドが非推奨になり (DB に関連テーブルを作成するために使用)、Connector/Net 6.6 がそのテーブルを移行しようとして例外が発生します。

于 2012-11-01T11:12:33.510 に答える