Пользовательская проверка с помощью MVC2 и EF4

в блоге ScottGu приведен пример использования пользовательской проверки MVC2 с EF4: http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx

Итак, вот проблема:

Когда конструктор в VS2010 создает объекты для БД, в примере вы должны добавить аннотацию [MetadataType (typeof (Person_validation))] к этому классу.

Но когда я что-то меняю в конструкторе, все эти аннотации теряются.

Можно ли сохранить самостоятельно внесенные изменения в файл edmx или есть лучший способ применить System.ComponentModel.DataAnnotations к сгенерированным объектам?

Спасибо.


person csharpnoob    schedule 01.05.2010    source источник


Ответы (1)


Вы делаете это с помощью шаблона, который в общих чертах называется «приятельские классы». По сути, вы создаете отдельный класс со своими метаданными и создаете частичный класс, который связывает сгенерированные сущности с классом вашего приятеля.

В качестве простого примера предположим, что у вас есть сущность Person, и вы хотите установить свойство FirstName как обязательное. Вот что вы бы сделали вне ваших сгенерированных файлов:

[MedadataType(typeof(PersonMetadata))]
partial class Person { } // the other part is generated by EF4

public class PersonMetadata
{
    // All attributes here will be merged into the generated class,
    // thanks to the partial class above. Just apply attributes as usual.

    [Required]
    public string FirstName { get; set; }
}

Вы можете найти более подробную информацию об этом подходе здесь. И ScottGu на самом деле тоже говорит об этом в статье, на которую вы ссылаетесь. Посмотрите под заголовком «Шаг 5: Сохранение в базе данных»;)

person Tomas Aschan    schedule 01.05.2010
comment
спасибо за ответ, но вопрос больше о части: [MedadataType (typeof (PersonMetadata))] partial class Person {} // другая часть создается классом EF4 Buddy с аннотациями, работают нормально. Но моя проблема в том, что у меня около 100 сущностей. если я внесу незначительные изменения в конструктор в Visual Studio, код будет регенерирован. поэтому все аннотации [MedadataType (typeof (....))], ссылающиеся на класс приятеля, исчезли. поэтому, если я просто добавлю атрибут, я могу снова добавить аннотацию к 100 классам. не совсем идея поколения с EF. - person csharpnoob; 03.05.2010
comment
@csharpnoob - Похоже, вы добавляете MetadataTypeAttribute не в те части частичных классов. Идея состоит в том, что, поскольку EF генерирует частичные классы, вы можете писать свои собственные части в разных файлах, которые не регенерируются, где вы применяете MetaDataAttribute . Я обычно помещаю частичный класс, применяющий атрибут, в тот же файл, что и класс приятеля, поэтому я могу сразу увидеть, какой класс (классы) будет затронут изменениями. - person Tomas Aschan; 03.05.2010
comment
блин. правильно моя вина! аннотации к частичному, я пропустил эту маленькую деталь. этот существует в любом случае для установки значений по умолчанию. еще раз спасибо. - person csharpnoob; 03.05.2010