Код Entity Framework Соглашения об именах - вернемся к именам таблиц во множественном числе? - PullRequest
36 голосов
/ 13 декабря 2010

Сначала я просто взломал код структуры сущностей. Следуя их соглашению об именах, мы теперь должны называть наши таблицы множественным числом, чтобы не вмешиваться в работу инструмента. Я знаю, что сопоставления могут быть перегружены. Мой вопрос в том, вернулись ли мы после нескольких лет следования единственному соглашению об именах во множественном числе?

Кроме того, мне было интересно, почему новые примеры используют Northwind вместо Adventure Works. Я думаю, причина в том, что AW использует единственное наименование, и они не смогут похвастаться отсутствием функций кода

Ответы [ 3 ]

70 голосов
/ 13 декабря 2010

RTM-версия Code First будет полностью поддерживать классную функцию под названием Сменные соглашения , где вы можете добавить или заменить соглашения по умолчанию, такие как упомянутое вами.

К счастью, то, что вы ищете, уже включено в CTP5.Вы можете отключить соглашение об именах таблиц для множественного использования, удалив PluralizingTableNameConvention соглашение.Вот весь код, который вам нужно написать для этого вопроса:

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

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


О ваших второстепенных вопросах причина, по которой вы больше обращаете внимание на базу данных Northwind, чем на Adventure Works, заключается в том, что AW огромен, а Northwindследовательно, довольно небольшая база данных лучше подходит для образцов и пошаговых руководств.Тем не менее, вам все равно нужно написать код для работы с базой данных Northwind в Code First.

2 голосов
/ 23 мая 2011

Вот один фрагмент кода, который я использую, и он работает на 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);
        }
    }

Попробуйте скопировать и вставить этот код, а затем написать некоторый код для запуска создания базы данных (т. Е. Попытаться извлечь записи и показать на странице индекса).

1 голос
/ 30 апреля 2011

Я пробовал и похоже, что 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

Одна вещь может отличаться, если я разделю свое решение на два проекта Core и Web. Ядро имеет Модели, Сервисы и весь Кодекс Сначала. Веб имеет только контроллеры и представления и ссылку на ядро. SetInitializer (). Seed () находится внутри функции в Core, а в Web global.asax вызывается Core.SetInitializer, поэтому все функции CTP5 хранятся внутри Core. База данных воссоздается нормально, данные заполняются хорошо, просто соглашение сохраняет PLURAL TABLE NAMES, игнорируя переопределение modelBuilder

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...