38

最初にエンティティ フレームワークのコードを試してみました。命名規則に従って、ツールに介入する必要がないように、テーブルに複数形の名前を付ける必要があります。マッピングをオーバーライドできることはわかっています。私の質問は、単数形の命名規則に従って何年も経った後、複数形の名前を使用することに戻るのでしょうか?

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

4

3 に答える 3

73

RTMバージョンのCodeFirstは、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がかなり小さいデータベースであるため、サンプルやウォークスルーに適しているためです。とはいえ、コードファーストでNorthwindデータベースを操作するには、コードを作成する必要があります。

于 2010-12-13T16:11:20.727 に答える
3

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

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

于 2011-05-23T09:15:06.533 に答える
1

私は試しましたが、EF4CTP5はそれを完全に無視しているようです。何が間違っている可能性がありますか?

セクションの使用:

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

異なる可能性があるのは、ソリューションをCoreとWebの2つのプロジェクトに分割したことです。Coreには、モデル、サービス、およびすべてのコードファーストがあります。Webには、コントローラーとビュー、およびCoreへの参照のみがあります。SetInitializer()。Seed()はCoreの関数内にあり、Web global.asaxではCore.SetInitializerが呼び出されるため、すべてのCTP5関数をCore内に保持します。データベースは正常に再作成され、データは正常に入力されます。慣例により、modelBuilderオーバーライドを無視して、複数のテーブル名が保持されます。

于 2011-04-30T14:59:51.543 に答える