Как лучше всего добавлять атрибуты к автоматически сгенерированным объектам (с использованием VS2010 и EF4)

ASP.NET MVC2 имеет сильную поддержку для использования атрибутов в сущностях (проверка, расширение вспомогательного класса Html и т. Д.).

Если я сгенерировал свою модель из базы данных с использованием модели данных сущности VS2010 EF4 (edmx и его класс cs), и я хочу добавить атрибуты для некоторых сущностей. что было бы лучше всего? как мне справиться с обновлением модели (добавление дополнительных полей / таблиц в базу данных и объединение их в edmx) - сохранит ли он мои атрибуты или сгенерирует новый файл cs, стирающий все?

(Ручные изменения этого файла могут вызвать непредвиденное поведение в вашем приложении.)

(Изменения, внесенные вручную в этот файл, будут перезаписаны при повторной генерации кода.)


person Dani    schedule 06.01.2011    source источник


Ответы (3)


Обычно вы создаете так называемые частичные классы, чтобы расширить свой автоматический -генерированные объекты.

Добавление атрибутов к созданным классам

person Leniel Maccaferri    schedule 06.01.2011
comment
но как мне добавить атрибут в поле, которое уже есть в сущности? Разве это не было бы переопределением? - person Dani; 06.01.2011
comment
спасибо, просто чтобы убедиться: я добавляю частично пустой класс (?) и помещаю [MetadataType (typeof (myclass_ext)) поверх него - а затем добавляю еще один частный класс с именем myclass_ext и добавляю фактические поля, которые я хотите изменить свои атрибуты на этот класс, и он работает с оригиналом? - person Dani; 07.01.2011
comment
Похоже, я не могу выполнить первую задачу - иметь пустой частичный класс. как только я это сделаю, класс теряет всех своих членов. Я пишу это как: общедоступный частичный класс mydb: ObjectContext {[MetadataType (typeof (EventLog_Ext))] общедоступный частичный класс EventLog: EntityObject {}} - person Dani; 07.01.2011

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

Мы используем это как

 List<ValidationResult> errorList = new List<ValidationResult>();
        bool bValid = client.IsValid<Client, ClientMetadata>(ref errorList, false);


    public static bool IsValid<T, U>(this T obj, ref List<ValidationResult> errors, bool validateAllProperties = true) where T : IValidatableObject
    {
        //If metadata class type has been passed in that's different from the class to be validated, register the association
        if (typeof(T) != typeof(U))
        {
            TypeDescriptor.AddProviderTransparent(new AssociatedMetadataTypeTypeDescriptionProvider(typeof(T), typeof(U)), typeof(T));
        }

        var validationContext = new ValidationContext(obj, null, null);
        var validationResults = new List<ValidationResult>();
        Validator.TryValidateObject(obj, validationContext, validationResults, validateAllProperties);

        errors = validationResults;

        if (validationResults.Count > 0)
            return false;
        else
            return true;
    }
person William    schedule 09.01.2011

Мы используем частичные классы, но если вам нужно, чтобы они сохранялись и обрабатывались EF, вариант «Обновить модель из базы данных» - ваш лучший друг.

person lukiffer    schedule 06.01.2011