33

私はエンティティフレームワークのコードを最初に批判しています。命名規則に従って、テーブルに複数の名前をつけて、ツールに介入する必要がなくなりました。私は写像が乗り越えられるかもしれないことを知っている。私の質問は、何年にもわたって単数形の命名規則に従った後、複数の名前を使用することに戻りますか?Entity Frameworkコード最初の命名規則 - 複数のテーブル名に戻る?

また、新しい例がAdventure Worksの代わりにNorthwindを使用していた理由がわかりました。私はその理由を考えているAWが特異ネーミングを使用して、彼らは何のコードを誇示しないことができないだろう

答えて

68

ていますので、コードファーストのRTM版は完全にプラグイン可能な表記と呼ばれるクールな機能をサポートしますですあなたが追加したり、あなたが言及したようなデフォルトの慣習を置き換えることができます。

幸いにも、あなたが探しているものはすでにCTP5に含まれています。 PluralizingTableNameConventionの規則を削除して、複数化テーブル名の規則を無効にすることができます。ごsecound質問について

using System.Data.Entity.ModelConfiguration.Conventions.Edm.Db; 

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


、あなたはより多くのAWは巨大で、ノースウィンドがかなり小さいという理由だけでAdventure WorksのよりNorthwindデータベースがある参照理由:これは、あなたがこの問題のために書くために必要なすべてのコードですしたがって、サンプルとチュートリアルに適しています。つまり、Code FirstのNorthwindデータベースで作業するためのコードを書く必要があります。

+0

私は、modelBuilder.Entity ()。ToTable( "ApplicationUser");のような形式で規約を上書きできることは知っていました。私はテーブルの特異な命名がまだ "in"のものであるかどうか疑問に思っています。 –

+0

流暢なAPIを使っていると言いましたが、それは*慣習*を無効にする*という意味ではありません。 *プラグイン可能な規約*によるアプリケーションのために、完全に*大会をオフにすることができます。明確にするために私の答えを更新しました。 –

+2

説明と例をありがとう。私はEF CodeFirstとMVC 3の間のFirehoseから飲んでいるような気がします! –

1

私は試してみましたが、EF4 CTP5はそれを完全に無視しています。何が間違っていますか?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.ComponentModel.DataAnnotations; 
using System.Data.Entity; 
using System.Data.Entity.ModelConfiguration; 
using System.Data.Entity.ModelConfiguration.Conventions.Edm; 

DbContext:

public class SiteDataContext : DbContext 
    { 
     public DbSet<Blog> Blogs { get; set; } 
     public DbSet<BlogFeedback> BlogFeedbacks { get; set; } 
     public DbSet<BlogCategoryList> BlogCategoryLists { get; set; } 
     public DbSet<BlogCategory> BlogCategories { get; set; } 

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

生成POCOクラス

public class Blog 
    {...} 
public class BlogFeedback 
    {...} 
public class BlogCategoryList 
    {...} 
public class BlogCategory 
    {...} 

テーブル:

Blogs 
BlogCategories 
BlogCategoryLists 
BlogFeedbacks 
セクションを使用して

私は必要なもの

Blog 
BlogCategory 
BlogCategoryList 
BlogFeedback 

ことの一つは異なる場合がありますが、私は二つのプロジェクトのコアとWebに私の解決策を分割しています。コアにはモデル、サービス、すべてのコードがあります。 Webには、コントローラとビューとCoreへの参照のみがあります。 SetInitializer()。Seed()はCoreの関数内にあり、Web global.asaxではCore.SetInitializerが呼び出されるため、すべてのCTP5関数をコア内に保持します。データベースは再作成されました。大丈夫です。データは大文字で入力されます。大文字と小文字の区別はなく、表名は複数あります。

+0

私はまったく同じ問題を抱えています。あなたは解決策を見つけましたか? – 0xbadf00d

+3

ええ、私は間違った慣習定数のスペルミスを犯しました。 "PluralizingEntitySetNameConvention"の代わりに "PluralizingTableNameConvention"を使用していることを確認してください – Nestor

+0

あまりにも、私はすでに正しいものを使用しています。なぜそれが無視されているのか分かりません。 – 0xbadf00d

2

ここで私が使用しているコードは100%です。コピーして貼り付けて試してみてください。名前のテーブル名は一意にする必要があります。私はEF4.1とCE4を使用しています。0

POCOクラス

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 

namespace CloudOne.Models 
{ 
    public class Brand 
    { 
     public int BrandID { get; set; } 
     [MaxLength(25)] 
     [Required] 
     public string BrandName { get; set; } 
     [MaxLength(1000)] 
     public string BrandDescription { get; set; } 
     public int SortOrder { get; set; } 
     //SEO 
     [MaxLength(70)] 
     public string PageTitle { get; set; } 
     [MaxLength(100)] 
     public string MetaDescription { get; set; } 
     [MaxLength(150)] 
     public string MetaKeywords { get; set; } 
     [MaxLength(56)] //50 + "-" + 99,000 
     public string Slug { get; set; } 
    } 
} 

データコンテキスト

using System; 
using System.Collections.Generic; 
using System.Data.Entity; 
using System.Data.Entity.ModelConfiguration.Conventions; 

namespace CloudOne.Models 
{ 
    public class SiteDataContext: DbContext 
    { 
     public DbSet<Brand> Brands { get; set; } 

     // Twist our database 
     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
      base.OnModelCreating(modelBuilder); 
     } 
    } 
} 

シード初期化子

public class SiteDataContextInitializer: DropCreateDatabaseIfModelChanges<SiteDataContext> 
    { 
     protected override void Seed(SiteDataContext context) 
     { 
      var brands = new List<Brand>() 
      { 
       new Brand { BrandName = "Brand 1", Slug = "brand-1" }, 
       new Brand { BrandName = "Brand 2", Slug = "brand-2" } 
      }; 

      brands.ForEach(d => context.Brands.Add(d)); 

      base.Seed(context); 
     } 
    } 

、データベースの作成をトリガするためにいくつかのコードを記述し、このコードをコピー&ペーストしてください(つまり、レコードをフェッチしてインデックスページに表示しようとします)。