Как изменить [DisplayName] свойств класса, созданного EF?

Мы знаем, что EF генерирует классы на основе таблиц, которые мы добавили в файл .edmx. Для них не будет никаких [DisplayName] DataAnnotations.

Как я могу добавить этот [DisplayName] сгенерированных классов, не изменяя их? потому что сгенерированные классы могут быть переопределены, если я изменю файл .edmx (повторно добавлю измененную таблицу), если база данных изменится. Поэтому я не хочу изменять сам класс генерации.

Класс, созданный EF

 public partial class Committee
    {
        public string Committee_Description { get; set; }
        public byte[] Committee_Id { get; set; }
        public string Rn_Descriptor { get; set; }
        public Nullable<System.DateTime> Rn_Create_Date { get; set; }
       ......
       .....

Вид

 <tr>
            <th>
                @Html.DisplayNameFor(model => model.Item2.GetEnumerator().Current.Committee_Name)
            </th>

person James123    schedule 25.03.2013    source источник
comment
Попробуйте добавить MetadataType — и создать частичный класс с атрибутами — если это проблема, с которой вы столкнулись — взгляните на эти ссылки — дайте мне знать, как это работает — stackoverflow.com/questions/14412468/ - stackoverflow.com/ вопросы/5889349/   -  person NSGaga-mostly-inactive    schedule 25.03.2013
comment
Я думаю, вы можете попробовать генератор POCO   -  person Alex Ovechkin    schedule 26.03.2013


Ответы (3)


Используйте класс метаданных и присоедините его к классу сущностей с помощью атрибута MetadataTypeAttribute. Вы указываете свои атрибуты аннотаций данных для свойств в классе метаданных (нет реализации для указанных свойств).

MSDN: http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.metadatatypeattribute.aspx

Редактировать: начальная ошибка — это пространство имен частичного класса, который вы определяете для присоединения атрибута MetadataTypeAttribute. Обязательно измените его пространство имен на пространство имен, используемое исходным объектом, чтобы он определял тот же класс.

person Moho    schedule 25.03.2013
comment
Хороший ответ - и точное последующее попадание! - person Daniël Camps; 06.04.2017

Вы можете изменить файл шаблона .tt, который генерирует код классов, чтобы использовать свойство Documentation вашей модели для создания классов с необходимыми атрибутами. Например, для EF5 вы можете заменить в *Model.tt метод CodeStringGenerator.Property() на:

public string Property(EdmProperty edmProperty)
{
    return string.Format(
        CultureInfo.InvariantCulture,
        "{5} {0} {1} {2} {{ {3}get; {4}set; }}",
        Accessibility.ForProperty(edmProperty),
        _typeMapper.GetTypeName(edmProperty.TypeUsage),
        _code.Escape(edmProperty),
        _code.SpaceAfter(Accessibility.ForGetter(edmProperty)),
        _code.SpaceAfter(Accessibility.ForSetter(edmProperty)),
        (edmProperty.Documentation == null ? "" : ("[Display(Name=\""+edmProperty.Documentation.Summary+"\")]"+Environment.NewLine+"   ")));
}

И CodeStringGenerator.UsingDirectives() с:

public string UsingDirectives(bool inHeader, bool includeCollections = true)
{
    return inHeader == string.IsNullOrEmpty(_code.VsNamespaceSuggestion())
        ? string.Format(
            CultureInfo.InvariantCulture,
            "{0}using System;{1}" +
            "{2}{3}",
            inHeader ? Environment.NewLine : "",
            includeCollections ? (Environment.NewLine + "using System.Collections.Generic;") : "",
            inHeader ? "" : Environment.NewLine,"using System.ComponentModel.DataAnnotations;"+Environment.NewLine)
        : "";
}

После этого установите свойство Documentation.Summary в модели и шаблоне .tt, чтобы сгенерировать все классы с соответствующими атрибутами без использования класса метаданных и присоединения его к вашему классу сущности через атрибут MetadataTypeAttribute. Например:

namespace DataAdmin.Models
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;

    public partial class Discount
    {
        public Discount()
        {
            this.DiscountPeriods = new HashSet<DiscountPeriod>();
            this.Clinics = new HashSet<Clinic>();
            this.Doctors = new HashSet<Doctor>();
            this.Servs = new HashSet<Serv>();
        }

        public int DiscountKey { get; set; }
        [Display(Name="Discount name")]
        public string Name { get; set; }
        public string MisCode { get; set; }
        public string MisName { get; set; }
        public string MisDesc { get; set; }
        public decimal Perc { get; set; }
        public int Rang { get; set; }
        public Nullable<int> DiscountTypeKey { get; set; }

        public virtual ICollection<DiscountPeriod> DiscountPeriods { get; set; }
        public virtual ICollection<Clinic> Clinics { get; set; }
        public virtual ICollection<Doctor> Doctors { get; set; }
        public virtual ICollection<Serv> Servs { get; set; }
        public virtual DiscountType DiscountType { get; set; }
    }
}
person user3760491    schedule 20.06.2014

Обратите внимание, что сгенерированный класс является частичным классом. Таким образом, вы можете создать еще один частичный класс с тем же именем и сделать аннотацию к нему. Тогда второй частичный класс не будет обновляться, если вы измените файл .edmx.

Подробнее о отображаемом имени MVC DB first Fix

person Wasa    schedule 01.08.2013