MVC4 + Entity Framework 4.4 + MySql + POCO/Code First
上記の構成を設定しています..これが私のクラスです:
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>
アプリケーションは正常にビルドされますが、製品(BTD.Data)をモデルクラスとして使用し、BTDContext(BTD.DataContext)をデータコンテキストクラスとして使用してコントローラーを追加しようとすると、次のエラーが発生します。
同じDbCompiledModelを使用してBTD.Data.Productのメタデータを取得できず、異なるタイプのデータベースサーバーに対してコンテキストを作成できません。代わりに、使用するサーバーのタイプごとに個別のDbCompiledModelを作成します。
私は完全に途方に暮れています-上記のエラーメッセージのほとんどすべての異なるバリエーションを考えてGoogleを調べましたが、役に立ちませんでした。
これは私が確認できるものです...
これも私の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"を使用しようとしたためです。そのため、これらのファイルがエラーの原因である可能性があると考えましたが、削除してもまだうまくいきません-
たくさんのファイルを事前に作成するVisual Studio MVCプロジェクトテンプレートを使用していることを皆さんに知らせたかっただけです。私はこれらのファイルを持たない空のMVCプロジェクトからこれをすべて再作成しようとしています-テストしたらこれを更新します
VS MVC基本テンプレートを使用するための更新:同じエラーが発生しました-それでも解決策はありません
同じ問題を経験している別の人
これは私のものを模倣した別のスタックオーバーフローの質問です -しかし私は彼の解決策を役に立たないように試みました-多分これと同じ問題を抱えている誰かがリンクから利益を得ることができます
[〜#〜]更新[〜#〜]
私は最近これをMS SQL Serverに入れてみましたが、ビューのスキャフォールディングはエラーなしで正常に追加されます-そのため、私のMySqlデータベースまたは接続文字列か、何が...私を混乱させていますか?.
その他の参考資料
他の誰かが私と同じ問題を抱えているようです-唯一の違いはSQLサーバーを使用していることです-私はすべてのコードを微調整して このstackoverflowの質問/ここに回答 の提案に従うようにしましたが、まだ役に立つ
可能な修正???
したがって、これは奇妙です... MS SQL Serverに接続してコントローラーを追加した後、接続文字列をMySqlに戻した後、実際にはMySqlで動作しています...一体何ですか!??
したがって、コントローラを追加しようとすると、ビューのスキャフォールディング(正しいフレーズですか?)がmysql接続文字列とともに追加されたときに失敗します。ただし、SQLサーバーのdbに接続すると、スキャフォールディングが生成されます。/controller、それからそれが機能するmysql接続文字列に戻します....?!?!
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>
プロバイダー名の変更に注意してください。
IMeshはほぼ私の問題を解決することを提案していますが、さらに一時的にコメントしました
[DbConfigurationType(typeof(MySqlEFConfiguration))]
これはDBContextクラスにありました。そしてもちろん、コントローラーの作成後、この行のコメントを外して、構成ファイルでSystem.Data.SqlClientをMySql.Data.MySqlClientに戻す必要があります。
VS 2013、MySQL Connector/NET 6.9.6、Entity Framework 6、Web API 2.2、MySQLサーバー5.7を使用して、「メタデータを取得できません」に関するエラーを防ぐために回答を組み合わせる必要がありました。
MySQL接続を使用する.NETプロジェクトにコントローラーを正常に追加するには、次のようにします。
System.Data.SqlClient
_をproviderName
として接続文字列を一時的に追加し、MySQLにコメントを付けます。接続文字列が有効かどうかは関係ありません。MySqlEFConfiguration
が有効になっていないことを確認してください。2番目の点について、 EF6でConnector/NETを使用することに関するMySQLのドキュメント は、MySqlEFConfiguration
を有効にする3つの可能な方法を述べています。 VSテンプレートを使用してコントローラーを追加する際は、これらが有効になっていないことを確認してください。
- DbConfigurationTypeAttributeをコンテキストクラスに追加します。
[DbConfigurationType(typeof(MySqlEFConfiguration))]
アプリケーションの起動時にDbConfiguration.SetConfiguration(new MySqlEFConfiguration())を呼び出す
構成ファイルにDbConfigurationタイプを設定します。
_
<entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6">
_
私もこのバグの周りをテストし、他の問題を見ました。
次のコードは私のWeb.configにあります(なしでは機能しません)。
<entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6">
それを次のように変更しました:
<entityFramework>
私のために働く...足場を追加し、それを元に戻す
EF 4.3.1とMySql Connecter/Net 6.6.4.0を使用して同じ問題が発生しています
これは私にとってはうまくいきました。Contextクラスの別のdbや追加のコードに接続する必要はありません。
足場を作成する場合は、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プロジェクトへのリンク
使ってみてください
System.ComponentModel.DataAnnotations
eDMクラスメンバーの[Key]属性とともに名前空間。
それは私のために働いた。