Использование System.ComponentModel.DataAnnotations с Entity Framework 4.0

Я работаю с MVC3 и использую Entity Framework 4.0 Entities в качестве моей модели. До сих пор все отлично работает, поскольку используется в качестве модели (все операции crud / генерации страниц работают из коробки). Мне интересно, однако, как вы получаете одинаковые надежные метки и данные проверки, как при создании модели вручную?

Вот пример того, что я имею в виду. Это class, сгенерированный образцом проекта MVC3:

public class LogOnModel { [Required] [Display(Name = "User name")] public string UserName { get; set; } [Required] [DataType(DataType.Password)] [Display(Name = "Password")] public string Password { get; set; } [Display(Name = "Remember me?")] public bool RememberMe { get; set; } } 

В приведенном выше примере вы можете указать, что будет отображаться в метке для поля (Дисплей) и в каком типе поля использовать (Пароль). Однако, когда я пытаюсь использовать структуру сущности и нажимаю ее на вид ниже, я вижу, что автоматически созданные метки являются именами полей, а не тем, что я хочу, чтобы пользователь мог видеть / читать:

 @using (Html.BeginForm()) { @Html.ValidationSummary(true) 
Person
@Html.LabelFor(model => model.FirstName)
@Html.EditorFor(model => model.FirstName) @Html.ValidationMessageFor(model => model.FirstName)
@Html.LabelFor(model => model.MiddleName)
@Html.EditorFor(model => model.MiddleName) @Html.ValidationMessageFor(model => model.MiddleName)
@Html.LabelFor(model => model.LastName)
@Html.EditorFor(model => model.LastName) @Html.ValidationMessageFor(model => model.LastName)
@Html.LabelFor(model => model.Birthdate)
@Html.EditorFor(model => model.Birthdate) @Html.ValidationMessageFor(model => model.Birthdate)

}

введите описание изображения здесь

Мой вопрос: как добавить эти дополнительные украшения в объекты, созданные с помощью EF4? Есть ли что-то помимо System.ComponentModel.DataAnnotations, которые я должен использовать? Я знаю, что объекты получаются регенерированными, и, вероятно, не рекомендуется добавлять это в код сущностей напрямую, но по какой-то причине я не могу придумать более подходящий подход, чем вручную ввести текст метки в представлении (хромой, нет причин для должны сделать это, это MVC!). Я хочу сохранить его таким образом, чтобы приложение было достаточно динамичным, чтобы иметь возможность отображать правильную отображаемую информацию для моей модели и поддерживать подход MVC. Как мне это сделать?

Я не делал этого для ASP.NET MVC (только для Silverlight), но я считаю, что те же принципы применимы. Вы можете создать «class друзей метаданных», как показано ниже, потому что типы, генерируемые EF, должны быть частичными, поэтому вы можете добавить к ним немного больше (например, метаданные атрибута), а затем вы создадите этот class, который содержит метаданные.

Это отвратительно, но должно работать. Это происходит примерно так (предполагая, что объект EF называется «Person»):

 [MetadataType(typeof(PersonMetadata))] public partial class Person { // Note this class has nothing in it. It's just here to add the class-level attribute. } public class PersonMetadata { // Name the field the same as EF named the property - "FirstName" for example. // Also, the type needs to match. Basically just redeclare it. // Note that this is a field. I think it can be a property too, but fields definitely should work. [Required] [Display(Name = "First Name")] public string FirstName; } 

То же, что и выше, но со всеми подробностями, и это работает

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

И вот код

 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.ComponentModel.DataAnnotations; namespace Validate.Models { [MetadataType(typeof(PersonMetadata))] public partial class Person { // Note this class has nothing in it. It's just here to add the class-level attribute. } public class PersonMetadata { // Name the field the same as EF named the property - "FirstName" for example. // Also, the type needs to match. Basically just redeclare it. // Note that this is a field. I think it can be a property too, but fields definitely should work. [Required] [Display(Name = "Enter Your Name")] public string FirstName; } } 

Как и ответ Остина Лэмба , но вместо этого, вложенность classа MetaData class сущности, тем самым уменьшая количество classов в вашем публичном списке имен и устраняя необходимость иметь уникальное имя для каждого classа метаданных.

 using System.ComponentModel.DataAnnotations; namespace Validate.Models { [MetadataType(typeof(MetaData))] public partial class Person { public class MetaData { [Required] [Display(Name = "Enter Your Name")] public string FirstName; //... } } } 
  • Объект нельзя удалить, поскольку он не найден в ObjectStateManager
  • Как установить значение по умолчанию для POCO в EF CF?
  • Не удалось выполнить проверку для одного или нескольких объектов. Дополнительную информацию см. В разделе «Свойство EntityValidationErrors».
  • Как преобразовать DbSet в инфраструктуру Entity в ObjectQuery
  • Преобразование Entity Framework / Linq EXpression из строки в int
  • Лучший способ запросить страницу данных и получить общее количество в инфраструктуре сущностей 4.1?
  • EF Code First: Как я могу увидеть свойство EntityValidationErrors из консоли пакета nuget?
  • Entity Framework / SQL2008 - Как автоматически обновлять поля LastModified для объектов?
  • Возможно ли по умолчанию использовать поле DateTime для GETDATE () с миграциями Entity Framework?
  • LEFT JOIN в LINQ для объектов?
  • Entity Framework 4 - AddObject vs Attach
  • Interesting Posts

    Подсчитайте все вхождения строки в большом количестве файлов с помощью grep

    Как работает шаблон прерывания LMAX?

    Ребенок с максимальной высотой: 100% переполняет родительский

    Завершить все предыдущие действия

    Как передавать данные между действиями в приложении Android?

    Cloning Fresh Windows 7 -fsed HDD для Linux Server, потому что не имеет внешнего жесткого диска или дисков для резервного копирования

    Как мне получить обменные курсы через API, например Google Finance?

    Как запустить onListItemClick в Listactivity с помощью кнопок в списке?

    Как восстановить отсутствующий беспроводной адаптер в Windows 10

    Как настроить Outlook 2010 для отправки автоматического ответа в зависимости от времени и дня недели?

    Когда предпочтительнее использовать volatile boolean в Java, а не AtomicBoolean?

    Каковы некоторые убедительные варианты использования зависимых типов методов?

    Автоматическая ширина столбца JavaFX 2

    Есть ли на C # String Tokenizer, например, Java?

    Отображение иерархии #include для файла C ++ в Visual Studio

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