Могу ли я указать глобальные правила сопоставления в First Framework Framework Code?

Я создаю приложение в ASP.NET MVC 4, используя Entity Framework Code First, и для простоты я наследую все модели, которые будут храниться в базе данных из BaseEntity, у которых есть Guid, DateCreated, LastEditDate и другое такие полезные свойства. Теперь я знаю, что я могу сказать EF сопоставить эти унаследованные свойства следующим образом:

protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity().Map(m => { m.MapInheritedProperties(); }); modelBuilder.Entity().Map(m => { m.MapInheritedProperties(); }); } 

Кажется глупым делать это для каждого предмета. Есть ли способ применить это правило ко всем объектам в одном?

Правильно указано, что в этом конкретном случае нет необходимости делать глобальное сопоставление, поскольку EF будет отображать свойства для каждого отдельного типа, если вы не делаете BaseEntity часть модели.

Но название вопроса указано в более общем виде и да, можно указать глобальные правила сопоставления, если вы настроите сопоставления по EntityTypeConfiguration s. Это может выглядеть так:

 // Base configuration. public abstract class BaseMapping : EntityTypeConfiguration where T : BaseEntity { protected BaseMapping() { this.Map(m => m.MapInheritedProperties()); // OK, not necessary, but // just an example } } // Specific configurations public class UserMapping : BaseMapping { } public class ProductMapping : BaseMapping { } public class TempModelsContext : DbContext { // Add the configurations to the model builder. protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Configurations.Add(new UserMapping()); modelBuilder.Configurations.Add(new ProductMapping()); } // DbSets ... } 

ЗАМЕТКА:

Начиная с платформы Entity Framework 6 некоторые из этих сопоставлений также могут быть решены с помощью специальных условных кодов: http://romiller.com/2013/01/29/ef6-code-first-configuring-unmapped-base-types/

Такое сопоставление, называемое отображением наследования на основе таблицы-на-конкретном типе (TPC), имеет смысл только в том случае, если вы действительно хотите использовать polymorphism, например, если вы хотите загрузить список из 10 объектов BaseEntity и ожидать, что фактический тип получит материализуется, так что список содержит 3 User объекта и 7 объектов Product .

Будет ли такой запрос когда-либо иметь какую-либо деловую значимость в вашем приложении? Глядя на ваш BaseEntity я могу видеть, что запрос всех объектов, которые, например, были созданы в определенную дату, независимо от того, какой тип объекта (если он получен из BaseEntity ), может оказаться полезным. Вам это нужно? Также имейте в виду, насколько сложным будет такой запрос. SQL должен запрашивать почти все таблицы в вашей базе данных, а затем объединять результат.

Я бы использовал отображение наследования только в том случае, если у него есть реальное деловое значение (например: Person которое имеет значимые свойства, такие как адрес, телефон, электронная почта и т. Д., Самостоятельно и Employee который является производным от Person и добавляет свойство Salary и HiredDate и т. Д. .).

В вашем случае я бы использовал BaseEntity только как базовый тип ваших сущностей и не указывал никакого сопоставления вообще для этого classа. EF все равно будет отображать унаследованные свойства, но как часть объекта User and Product и т. Д., А не как его собственный объект. Я бы даже не назвал его «Base Entity », но … я не знаю … возможно, EntityBase (что означает: база (class) всех сущностей, но не сама сущность).

  • EF 4.1 code-first: Как заказать свойства навигации при использовании методов Include и / или Select?
  • Фильтр / поиск с использованием нескольких полей - ASP.NET MVC
  • Как применить OrderBy в IQueryable, используя имя столбца строки в универсальном методе расширения?
  • Как сравнивать только даты без времени в типах DateTime в Linq to SQL с Entity Framework?
  • Как использовать инструменты Entity Framework Power Tools в Visual Studio 2015?
  • Значение не может быть нулевым. Имя параметра: источник
  • Entity Framework Code First - два внешних ключа из одной таблицы
  • Сохранение и извлечение изображения (двоичного) из SQL Server с использованием Entity Framework 6
  • MySQL - Entity: значение для столбца IsPrimaryKey в таблице «TableDetails» - DBNull
  • EF LINQ включает несколько и вложенные объекты
  • Entity Framework 4.1 загрузка по умолчанию по умолчанию
  • Interesting Posts

    Компьютер включается после любого режима

    Создание outlookов с помощью модели TensorFlow

    Как установить или изменить версию Java (JDK) по умолчанию на OS X?

    Обложки iPhone для iPhone UITextField

    Как импортировать XML-файл в таблицу базы данных MySQL, используя XML_LOAD (); функция

    Где эта ошибка исходит из

    Есть ли способ узнать, отображается ли мягкая клавиатура?

    Удаленный доступ emacs к моему основному компьютеру

    XML – данные на корневом уровне недействительны

    JsonMappingException: не найдено подходящего конструктора для типа : невозможно создать экземпляр из объекта JSON

    Шпатлевка: обновить экран VIM

    Чтение PDF с использованием itextsharp, где язык PDF не является английским

    Какова разница между типичными параметрами функции и типизированными параметрами протокола?

    Не удается установить драйверы для Windows XP. Программа слишком большая, чтобы поместиться в памяти

    Excel Vba (кнопка onclick)

    Давайте будем гением компьютера.