MySQL .netコネクタ6.4.4.0とEntity Frame work 4.1を使用し、最も基本的なコードファースト実装を作成しようとしています。
public class myDB: DbContext
{
public DbSet<Vote> Votes { get; set; }
}
私のモデル
public class Vote
{
public Guid Id { get; set; }
public int Value { get; set; }
}
私のホームコントローラー
public class HomeController : Controller
{
myDB_db = new myDB();
public ActionResult Index()
{
var model = _db.Votes;
return View(model);
}
}
強く型付けされたビュー(List scaffoldを使用)
@model IEnumerable<Namespace.Models.Vote>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table>
<tr>
<th>
@Html.DisplayNameFor(model => model.Value)
</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Value)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.Id }) |
@Html.ActionLink("Details", "Details", new { id=item.Id }) |
@Html.ActionLink("Delete", "Delete", new { id=item.Id })
</td>
</tr>
}
</table>
MySQLにすべての適切なプロパティを持つ「投票」テーブルを作成します。
ただし、次の行でスローされます。
@foreach(モデルのvarアイテム)
例外:
"テーブル 'mydb.vote'は存在しません"
編集:明確にするために、私は実際にテーブルの複数形が必要であり、テーブルを適切に作成するようです。私は単数/複数の矛盾の理由を発見したいと思っています。 Microsoft/Plural Sight/scott guのチュートリアルとビデオはいずれもmysqlを使用しないため、.netconnectorが原因であると想像する必要があります。また、[Table( "Votes")]属性の使用を避けたいと思います。基本的に、できるだけ「すぐに使える」ソリューションを期待しています。
edit2(より関連性の高いコード):これを削除すると...テーブルがすべて一緒に作成できません。しかし、ビューは「投票」ではなく「投票」を検索する例外をスローします。 global.asax内
protected void Application_Start()
{
Database.SetInitializer(new DropCreateDatabaseAlways<myDB>());
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
public class myDBInitializer : DropCreateDatabaseAlways<myDB>
{
protected override void Seed(myDBcontext)
{
base.Seed(context);
}
}
だから、私はそれをやるべきだと思った方法でそれをやろうとするのをあきらめ、複数形をまとめて取り除いた。確かにはわかりませんが、mysql .netコネクタのEFのサポートに問題があると思います。これが私がしたことです。
まず、ApplicationStartメソッドにバグがありました。
//WRONG
//Database.SetInitializer(new DropCreateDatabaseAlways<myDB>());
Database.SetInitializer(new myDBInitializer());
次に、jgauffinの提案に従って実装しただけなので、元のコードにはリストされていないOnModelCreating基本実装の呼び出しを停止しました。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//DONT DO THIS ANYMORE
//base.OnModelCreating(modelBuilder);
//modelBuilder.Entity<Vote>().ToTable("Votes")
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
第三に、MySQL .netコネクタではEFが実際にデータベースを作成できないため、空のDBを最初に作成したという記事をいくつか読みました。これは、コネクタ6.4.4+ではもはや当てはまらないようであり、接続文字列のユーザーが新しいデータベースを作成する能力を持っている限り、最初にデータベースが存在していなければうまく機能します。
一度、私は上記のすべてを行った、それはうまくいくように見えた。だから今、私は少なくとも前進することができます。将来的に複数/単一の不一致の原因を突き止められることを願っています。
皆さんの時間と労力に感謝します。
MyDBコンテキストクラスで、次のメソッドをオーバーライドします
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
base.OnModelCreating(modelBuilder);
}
生成されたテーブル名を複数形にしないようにします。
単一のテーブル名を保持するテーブルに関連するDbContext
クラスを開きます。
EF 6を使用している場合、次への参照を追加します。
using System.Data.Entity.ModelConfiguration.Conventions;
古いバージョンの場合、次への参照を追加します。
using System.Data.Entity.ModelConfiguration.Conventions.Edm.Db;
最後に、OnModelCreating
をオーバーライドするメソッドを作成し、テーブル名を複数形にする規則を削除します。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
エンティティオブジェクトを作成するときに、「Pluralize or singularsize generated objects names」チェックマークを削除します。
テーブル名を指定するには、DbContextで OnModelCreating をオーバーライドする必要があります。
modelBuilder.Entity<Vote>().MapSingleType().ToTable("Votes")
EF 6.1 +でCode Firstを使用している場合は、 OnModelCreating イベントハンドラーをオーバーライドし、次の呼び出しを行います。
dmbCloud.Conventions.Remove<PluralizingEntitySetNameConvention>();
dmbCloud.Conventions.Remove<PluralizingTableNameConvention>();