web-dev-qa-db-ja.com

Entity Framework Code Firstの命名規則-複数のテーブル名に戻りますか?

まず、エンティティフレームワークのコードを最初に確認します。命名規則に従って、ツールに介入する必要がないように、テーブルに複数の名前を付ける必要があります。マッピングがオーバーライドされる可能性があることは知っています。私の質問は、長年にわたって単数形の命名規則に従っていた後、複数形の名前を使用することに戻ったということです。

また、なぜ新しい例がAdventure Worksの代わりにNorthwindを使用していたのか疑問に思っていました。その理由は、AWが単数形のネーミングを使用しており、コードなしの機能を誇示できないためだと考えています

36
Paul Speranza

RTM Code Firstのバージョンは、Pluggable Conventionsというクールな機能を完全にサポートします言及したようなデフォルトの規則を追加または置換できます。

幸いなことに、探しているものはすでにCTP5に含まれています。 PluralizingTableNameConvention規則を削除すると、複数形テーブル名の規則をオフに切り替えることができます。これはこの問題のために書く必要があるすべてのコードです:

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

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


2番目の質問について、Adventure WorksよりもNorthwindデータベースの方がよく見える理由は、AWが巨大で、Northwindがかなり小さいデータベースであるため、サンプルやウォークスルーに適しているからです。とは言うものの、Code FirstでNorthwindデータベースを操作するにはいくつかのコードを記述する必要があります。

70
Morteza Manavi

ここに私が使用しているコードの抜粋があり、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);
        }
    }
}

Seed初期化子

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);
        }
    }

このコードをコピーして貼り付けてから、データベースの作成をトリガーするコードを作成します(つまり、レコードを取得してインデックスページに表示します)。

2
Nestor

私は試しましたが、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

1つの違いは、ソリューションをCoreとWebの2つのプロジェクトに分割することです。コアには、モデル、サービス、およびすべてのコードファーストがあります。 Webには、コントローラーとビュー、およびCoreへの参照のみがあります。 SetInitializer()。Seed()はCoreの関数内にあり、Web global.asaxではCore.SetInitializerが呼び出されるため、すべてのCTP5関数をCore内に保持します。データベースは正常に再作成され、データは正常に書き込まれます。慣例だけでPLURAL TABLE NAMESが保持され、modelBuilderオーバーライドは無視されます

1
Nestor