Entity Frameworkは複数のテーブル名を作成しますが、ビューには単一のテーブル名が必要ですか?

MySQLの.netコネクタ6.4.4.0とEntity Frameの作業4.1を使用しており、最も基本的なコードファースト実装を作成しようとしています。

public class myDB: DbContext
{
    public DbSet 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

@{
    ViewBag.Title = "Index";
}

Index


@Html.ActionLink("Create New", "Create") <table> <tr> <th> @Html.DisplayNameFor(model => model.Value) </th> <th></th> </tr> @foreach(モデル内のvarアイテム) { <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でテーブル 'votes'を作成します。

しかし、それはこの行にスローされます:

@foreach(モデル内のvarアイテム)

例外はあります:

"テーブル 'mydb.vote'は存在しません"

編集: 明確にするために、私は実際にテーブルの複数化を望んでおり、テーブルを適切に作成するようです。私は、単数/複数の不一致の理由を発見したいと考えています。 Microsoft/Plural Sight/scott guのチュートリアルやビデオは、mysqlを使用して処理するものなので、.netconnectorが原因である可能性があります。また、[Table( "Votes")]属性の使用を避けたいと思います。基本的には、できるだけ多くの「すぐに使える」ソリューションを望んでいます。

edit2(より関連性の高いコード): 私がこれを取り除くと、テーブルはすべて一緒に作成されません。 ビューは 'vote'ではなく 'votes'を探す例外をスローします。 global.asax内

protected void Application_Start()
{
     Database.SetInitializer(new DropCreateDatabaseAlways());

     AreaRegistration.RegisterAllAreas();
     RegisterGlobalFilters(GlobalFilters.Filters);
     RegisterRoutes(RouteTable.Routes);
}

public class myDBInitializer : DropCreateDatabaseAlways
{
    protected override void Seed(myDBcontext)
    {
        base.Seed(context);
    }
}
28
@cwyers:遅すぎるのでなければ、私たちのローカルDBAから聞いたことがあり、テーブル名を単数で保管するのがDBの習慣であることを読んだ。
追加された 著者 Merlyn Morgan-Graham,
Table 属性を使用して問題を解決していますか?属性が気に入らなければ、流暢なAPIを使うこともできます。 SQL Expressで試してみましたか?たぶんMySQLコネクタに問題があります
追加された 著者 flipchart,
私はMySQLを全く知らないので、MySQLのテーブルの名前が「vote」で、「vote」ではないことを100%確信しているかどうか尋ねることができます
追加された 著者 flipchart,
私は実際に投票クラスの上に[Table( "Votes")]を追加しようとしましたが、問題はそのまま残ります。そして、いいえ、私はSQLExpressで試したことがありません。なぜなら、私はそれをmysql :-)で動作させる必要があるからです。
追加された 著者 nograde,
ps。 table属性の値をVoteにすると、問題が修正されます。ビューが間違ったテーブル名を期待するのはなぜですか? :(
追加された 著者 nograde,
うん、ちょうどサーバーにログインし、dbをチェックアウトした。間違いなく「票」と名づけられました。
追加された 著者 nograde,

6 答え

だから、私はそれをやるべきであると感じたやり方でやってみることをやめ、複数化を一斉に取り除いた。私は本当にわからないが、問題はmysqlの.netコネクタのEFのサポートと関係があると考えている。ここに私がしたことがあります。

まず、私のApplicationStartメソッドにバグがありました:

//WRONG
//Database.SetInitializer(new DropCreateDatabaseAlways());
Database.SetInitializer(new myDBInitializer());

2つ目は、jgauffinの提案に基づいて実装しただけなので、元のコードにリストされていないOnModelCreatingベース実装の呼び出しを停止しました。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    //DONT DO THIS ANYMORE
    //base.OnModelCreating(modelBuilder);
    //modelBuilder.Entity().ToTable("Votes")
    modelBuilder.Conventions.Remove();
}

第3に、私はいくつかの記事でMySQLの.netコネクタはEFが実際にデータベースを作成させないようにしていたので、最初は空のDBを作成しました。これはもはやコネクタ6.4.4以降のケースではないようですが、接続文字列のユーザーが新しいデータベースを作成する能力を持っている限り、最初に存在しないデータベースがあればよりうまく動作します。

一度、私はすべての上記を行った、それは動作するように見えた。今私は少なくとも前進することができます。うまくいけば、将来、複数形/特異形の不一致の原因を突き止めることができます。

時間と労力のために皆様に感謝します。

42
追加された
ありがとうございました。 TableAttribute を削除するのを忘れたことを意味します。あなたのモデルの1つ(エラー150は外部キー関連です)。
追加された 著者 Marthijn,

myDBコンテキストクラスで、次のメソッドをオーバーライドします

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove();
    base.OnModelCreating(modelBuilder);
}

生成されたテーブル名を複数形にしないようにします。

18
追加された
ああ、実際には複数のテーブル名が必要です。その場合、上記のことは役に立たないでしょう。記述された動作は、MySQL EFプロバイダのバグのように聞こえます。
追加された 著者 Morten Mertner,
ここで、モルテンの記事のより長い説明があります。 edspencer.me.uk/2012/03/13 /&hellip;
追加された 著者 Sameer,
私はあなたが正しいと思うモートン。
追加された 著者 nograde,

エンティティオブジェクトを作成するときに、「生成されたオブジェクト名をPluralizeまたはsingularizeize」チェックマークを削除します。

enter image description here

8
追加された
最初にコードを書くことはできません。
追加された 著者 jgauffin,
このメソッドは、新しいエンティティオブジェクトを追加し、既存のデータベーススキーマを指す場合に機能します。
追加された 著者 Dan,
ちょっとダン、応答のおかげで。これは文字通り私の最初のMVC/EFプロジェクトであり、コードファーストアプローチを使用しています。私はあなたがスクリーンショットを提出したメニューにどのようにアクセスするかについて完全にはわかりません。私を啓発できますか?ありがとう!
追加された 著者 nograde,

特異なテーブル名を保持するテーブルに関連する 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();
}
7
追加された

OnModelCreating をDbContextで使用してテーブル名を指定します。

modelBuilder.Entity().MapSingleType().ToTable("Votes")
3
追加された
ラインは呼ばれていますか?ブレークポイントを設定する
追加された 著者 jgauffin,
ありがとう!投票は既に「Votes」テーブルにマップされていますが、EFの魔法の「コードビハインド」でいくつかのドットを結びつけるかどうかを調べるためにこれを導入しました。しかし、mydb.voteを探す例外はまだスローされています。
追加された 著者 nograde,
それは呼び出されます。
追加された 著者 nograde,

EF 6.1 +でコードファーストを使用している場合は、 OnModelCreating イベントハンドラを呼び出し、次の呼び出しを行います。

dmbCloud.Conventions.Remove();
dmbCloud.Conventions.Remove();
2
追加された