36

MySQL.netコネクタ6.4.4.0とEntityFramework 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);
    }
}

強く型付けされたビュー(リストスキャフォールドを使用)

@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にテーブル「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<myDB>());

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

public class myDBInitializer : DropCreateDatabaseAlways<myDB>
{
    protected override void Seed(myDBcontext)
    {
        base.Seed(context);
    }
}
4

6 に答える 6

48

それで、私はそれをやるべきだと思った方法でやろうとするのをあきらめ、複数形を一斉に削除しました。確かなことはわかりませんが、問題は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以降には当てはまらないようです。接続文字列のユーザーが新しいデータベースを作成できる限り、データベースが最初に存在しない場合は、より適切に機能します。

一度、私は上記のすべてをしました、それはうまくいったようでした。だから今、私は少なくとも前進することができます。将来的には、複数形/単数形の不一致の原因を突き止めることができれば幸いです。

時間と労力を費やしてくれた皆さんに感謝します。

于 2011-10-28T11:31:08.080 に答える
22

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

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

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

于 2011-10-28T07:57:37.420 に答える
12

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>();
}
于 2016-03-11T04:28:15.923 に答える
10

エンティティオブジェクトを作成するときに、[複数のオブジェクト名または単一サイズの生成されたオブジェクト名]チェックマークを外します。

ここに画像の説明を入力してください

于 2011-10-28T03:22:33.153 に答える
3

テーブル名を指定するには、DbContextでOnModelCreatingオーバーライドする必要があります。

modelBuilder.Entity<Vote>().MapSingleType().ToTable("Votes")
于 2011-10-28T04:02:21.137 に答える
3

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

dmbCloud.Conventions.Remove<PluralizingEntitySetNameConvention>();
dmbCloud.Conventions.Remove<PluralizingTableNameConvention>();
于 2014-12-26T21:45:06.737 に答える