9

Hibernate などの ORM フレームワーク、さらには Entity Framework 3.0 の経験があります。

デフォルトでは、これらのフレームワークはテーブルに単数形の名前を使用します。たとえば、クラス User はテーブル User にマップされます。

しかし、Visual Studio 2012 を使用して EF 5.x に移行すると、複数形の名前が使用され、as を使用してそのクラスを手動でマップしない限り、多くのエラーが発生しTableAttributeます。

[Table("User")]
public class User {
    // ...
}

なしTableAttributeで、DbContext以下の場合:

public CustomContext : DbContext {
    // ...
    public DbSet<User> Users { get; set; }
}

次に呼び出します:

var list = db.Users.ToList();

生成された sql は次のようになります。

Select [Extent1].[Username] From [Users] as [Extent1]

したがって、 Usersという名前のテーブルがないため、エラーが発生します。さらに、単数形から複数形への名前テーブルを参照します。このリンクで理由がわかります

なぜ Microsoft は EF 3.0 と同じではなく、そのように EF 5.x を実装するのだろうか?

更新しました:

コンテキスト クラスで次のコードを使用することにより、複数形の名前を使用しないように EF に指示できます。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

    base.OnModelCreating(modelBuilder);
}

EF ツールが複数形の名前を生成したとしても、元のデータベースへのマッピングを保持する必要がありますね。一部のユーザーは、クラスのフィールドの名前をいくつか変更したい場合があるためです。EF 3.0 は正常に機能しますが、EF 5.x は機能しません。

みんな、理由を教えてください!

4

2 に答える 2

12

その規則はPluralizingTableNameConvention、デフォルトで定義されている規則で定義されていますDbModelBuilder.Conventions

すべてのテーブルから除外する場合は、この質問のコードを使用できます。

なぜこれがこのように行われるのかはわかりませんが、個人的には、テーブル名を複数形にする必要があると考えるキャンプにいると言わなければなりません:)

SQL Server インスタンスで提供されるサンプル データベースのうち、Northwind には複数形があり、AdventureWorks には単数形が使用されているため、せいぜい確立された標準はありません。それぞれについて賛否両論、かなりの数の議論をしてきましたが、誰もが同意できることの 1 つは、一度命名戦略を選択したら、それを固守するべきだということです。

于 2012-12-20T09:57:16.483 に答える
0

エンティティフレームワークを使用してモデルを生成する場合は、[生成されたオブジェクト名を複数化または単一化する]のチェックを外します

于 2012-12-20T09:53:43.887 に答える