Подтвердить что ты не робот

Код структуры Entity Framework Первые соглашения об именах - назад к именам множественных таблиц?

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 3

Я пробовал и как 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. У Core есть модели, услуги и весь код в первую очередь. В Интернете есть только контроллеры и представления и ссылка на Core. SetInitializer(). Seed() находится внутри функции в Core, а в Web global.asax вызывается Core.SetInitializer, поэтому сохраняйте все функции CTP5 внутри Core. База данных воссоздается нормально, данные заполняются нормально, только соглашение сохраняет PLURAL TABLE NAMES, игнорируя переопределение modelBuilder