Использование 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; //... } } } 
  • Entity Framework 4 - AddObject vs Attach
  • Entity Framework Code First Fluent Api: добавление индексов в столбцы
  • String.Equals () не работает по назначению
  • Как реализовать Единицу работы, которая работает с EF и NHibernate
  • Использование свойств DateTime в Code-First Entity Framework и SQL Server
  • Является ли DbContext таким же, как DataContext?
  • Преобразование Entity Framework / Linq EXpression из строки в int
  • Entity Framework 4 выборочно ленивые свойства загрузки
  • Какие эффекты могут иметь ключевое слово virtual в Entity Framework 4.1 POCO Code First?
  • Тайм-ауты структуры организации
  • Entity Framework / Linq to SQL: Skip & Take
  • Давайте будем гением компьютера.