18

MVC4 + Entity Framework 4.4 + MySql + POCO/コード ファースト

上記の構成をセットアップしています..ここに私のクラスがあります:

namespace BTD.DataContext
{
public class BTDContext : DbContext
{

    public BTDContext()
        : base("name=BTDContext")
    {

    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        //modelBuilder.Conventions.Remove<System.Data.Entity.Infrastructure.IncludeMetadataConvention>();
    }

    public DbSet<Product> Products { get; set; }

    public DbSet<ProductImage> ProductImages { get; set; }        


}
}

namespace BTD.Data
{
[Table("Product")]
public class Product
{
    [Key]
    public long ProductId { get; set; }

    [DisplayName("Manufacturer")]
    public int? ManufacturerId { get; set; }

    [Required]
    [StringLength(150)]
    public string Name { get; set; }

    [Required]
    [DataType(DataType.MultilineText)]
    public string Description { get; set; }

    [Required]
    [StringLength(120)]
    public string URL { get; set; }

    [Required]
    [StringLength(75)]
    [DisplayName("Meta Title")]
    public string MetaTitle { get; set; }

    [DataType(DataType.MultilineText)]
    [DisplayName("Meta Description")]
    public string MetaDescription { get; set; }

    [Required]
    [StringLength(25)]
    public string Status { get; set; }

    [DisplayName("Create Date/Time")]
    public DateTime CreateDateTime { get; set; }

    [DisplayName("Edit Date/Time")]
    public DateTime EditDateTime { get; set; }
}

[Table("ProductImage")]
public class ProductImage
{
    [Key]
    public long ProductImageId { get; set; }

    public long ProductId { get; set; }

    public long? ProductVariantId { get; set; }

    [Required]
    public byte[] Image { get; set; }

    public bool PrimaryImage { get; set; }

    public DateTime CreateDateTime { get; set; }

    public DateTime EditDateTime { get; set; }

}
}

これが私のweb.configセットアップです...

<connectionStrings>
<add name="BTDContext" connectionString="Server=localhost;Port=3306;Database=btd;User Id=root;Password=mypassword;" providerName="MySql.Data.MySqlClient" />
</connectionStrings>
  1. データベースとテーブルは既に存在します...
  2. 私はまだmvcでかなり新しいですが、このチュートリアルを使用していました

アプリケーションは正常にビルドされます...ただし、Product (BTD.Data) をモデル クラスとして使用し、BTDContext (BTD.DataContext) をデータ コンテキスト クラスとして使用してコントローラーを追加しようとすると、次のエラーが表示されます。

同じ DbCompiledModel を使用して BTD.Data.Product のメタデータを取得して、異なる種類のデータベース サーバーに対してコンテキストを作成できないことはサポートされていません。代わりに、使用するサーバーの種類ごとに個別の DbCompiledModel を作成してください。

私は完全に途方に暮れています-私が考えることができる上記のエラーメッセージのほぼすべての異なるバリエーションでGoogleを精査しましたが、役に立ちませんでした.

以下、確認できる事項です...

  1. MySql は正常に動作しています
  2. 私は MySql Connector バージョン 6.5.4 を使用しており、他の ASP.net Web フォーム + エンティティ フレームワーク アプリケーションをゼロの問題で作成しました。

また、これをweb.configに含めたり削除したりしようとしました:

<system.data>
<DbProviderFactories>
  <remove invariant="MySql.Data.MySqlClient"/>
  <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.5.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
</DbProviderFactories>

私は文字通りこのバグに何日も取り組んできました-私はそれを解決するために誰かに喜んでお金を払うつもりです..冗談ではありません...私はMVC 4とRazorを本当に使いたいです-私はこれを始めることにとても興奮していましたが、今ではかなりがっかりしています - これに関する助け/ガイダンスに本当に感謝しています!

また、注意してください-私はNugetのEntityframeworkを使用しています...

別のメモ

アカウント ページなどで MVC プロジェクトを作成するデフォルトのビジュアル スタジオ テンプレートを使用していました。存在しない「DefaultConnection」を使用しようとしていたため、追加されたファイルへのすべての参照を削除しました-したがって、それらのファイルがエラーの原因である可能性があると思いました-しかし、それらを削除した後もまだ運がありません-

たくさんのファイルを事前に作成するビジュアル スタジオ MVC プロジェクト テンプレートを使用していることをみんなに知らせたかっただけです。これらのファイルを持たない空の MVC プロジェクトからこれをすべて再作成しようとしています - テストしたらこれを更新します

VS MVC 基本テンプレートを使用するように更新:同じエラーが発生しました - まだ解決策はありません

同じ問題を経験している別の人

ここに、私のものを模倣した別のスタックオーバーフローの質問があります-しかし、私は彼の解決策を試してみましたが、役に立たなかった-おそらく、同じ問題を抱えている他の誰かがリンクから恩恵を受けることができます

アップデート

私は最近、これをMS Sql Serverに入れようとしましたが、ビューの足場はエラーなしでうまく追加されました.

その他の参考文献

他の誰かが私と同じ問題を抱えているようです-唯一の違いは、彼らがSQLサーバーを使用していることです-すべてのコードを微調整して、このスタックオーバーフローの質問/回答の提案に従ってみましたが、それでも役に立ちません

可能な修正???

これは奇妙です... MS Sqlサーバーに接続してコントローラーを追加した後、接続文字列をMySqlに戻すと、実際にはMySqlで動作しています...一体何!??

したがって、コントローラーを追加しようとすると、ビューの足場 (正しいフレーズですか?) が追加され、mysql 接続文字列が失敗するようです...ただし、それを SQL サーバー データベースに接続すると、足場が生成されます。 /controller、それから動作する mysql 接続文字列に戻ります.... ?!?!

4

6 に答える 6

25

MVC4 コントローラーのスキャフォールディングが MySql 接続文字列を正しく認識していないようです。コントローラーの EF CRUD コードを生成するときに、以下に示すように接続文字列を変更します。

<connectionStrings>
    <add name="BTDContext" connectionString="Data Source=host_name;Database=database_name;uid=user_id;pwd=password;" providerName="System.Data.SqlClient" /> 
</connectionStrings>

アプリケーションの実行時に標準に戻します。

<connectionStrings>
    <add name="BTDContext" connectionString="Data Source=host_name;Database=database_name;uid=user_id;pwd=password;" providerName="MySql.Data.MySqlClient" /> 
</connectionStrings>

プロバイダー名の変更に注意してください。

于 2012-12-29T12:22:45.837 に答える
10

VS 2013、MySQL Connector/NET 6.9.6、Entity Framework 6、Web API 2.2、および MySQL サーバー 5.7 を使用して、「メタデータを取得できません」というエラーを防ぐために回答を組み合わせる必要がありました。

MySQL 接続を使用する .NET プロジェクトにコントローラーを正常に追加するには、次の手順を実行します。

  1. を使用して接続文字列を一時的に追加し、System.Data.SqlClientMySQLproviderName用のコメントを付けます。接続文字列が有効かどうかは問題ではありません。
  2. MySqlEFConfiguration決して有効になっていないことを確認してください。
  3. 再構築します。

2 番目の点について、EF6 での Connector/NET の使用に関する MySQL のドキュメントでは、MySqlEFConfiguration. VS テンプレートを使用してコントローラーを追加するときは、これらのいずれも有効にしないでください。

  1. コンテキスト クラスにDbConfigurationTypeAttributeを追加します。

[DbConfigurationType(typeof(MySqlEFConfiguration))]

  1. アプリケーションの起動時にDbConfiguration.SetConfiguration(new MySqlEFConfiguration())を呼び出す

  2. 構成ファイルでDbConfigurationタイプを設定します。

<entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6">

于 2015-04-08T14:42:06.620 に答える
10

私の問題をほぼ解決することを示唆するimeshですが、さらに一時的にコメント行を追加しました

[DbConfigurationType(typeof(MySqlEFConfiguration))]

これは DBContext クラスにありました。そしてもちろん、コントローラーを作成した後、この行のコメントを解除し、構成ファイルで System.Data.SqlClient を MySql.Data.MySqlClient に戻す必要があります。

于 2014-09-03T09:23:46.340 に答える
1

このバグについてもテストしたところ、別の問題が見つかりました。

次のコードは私の Web.config にあります (なしでは動作しません):

<entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6">

次のように変更しました。

<entityFramework>

私にとってはうまくいきます...足場を追加してから元に戻します

于 2015-11-08T14:03:13.517 に答える
0

私はEF 4.3.1とMySql Connector/Net 6.6.4.0を使用して同じ問題を抱えています

これは私にとってはうまくいきました。Context クラスの別のデータベースや追加のコードに接続する必要はありません。

スキャフォールドを構築する場合は、web.config ファイルの entityFramework タグの間にこれを追加します。

<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
  <parameters>
    <parameter value="Data Source=.\SQLEXPRESS; Integrated Security=True; MultipleActiveResultSets=True" />
  </parameters>
</defaultConnectionFactory>

次に、移行を実行する場合は上記のコードをコメントアウトし、その逆も同様です。

したがって、web.config は次のようになります。

<entityFramework>
  <contexts>
    <context type="ApptManager.Models.AppointmentsManagerContext, ApptManager">
      <databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[ApptManager.Models.AppointmentsManagerContext, ApptManager], [ApptManager.Migrations.Configuration, ApptManager]], EntityFramework" />
    </context>
  </contexts>
  <!--<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
    <parameters>
      <parameter value="Data Source=.\SQLEXPRESS; Integrated Security=True; MultipleActiveResultSets=True" />
    </parameters>
  </defaultConnectionFactory>-->
</entityFramework>

これは、.NET 開発者が自分のコードを機能させるために、いくつかの困難な道のりを飛び越えなければならないという非常にばかげた方法です。

実施例

https://github.com/dublinan/mvc-mysql-ef-example

私のgithubプロジェクトへのリンク

于 2013-02-05T17:03:35.843 に答える