Использование класса (ов) базовой модели без его изменения в asp.net mvc

Допустим, я создал несколько моделей через Entity Framework, и одна из них называется Paper_Results. Вот как может выглядеть класс:

public partial class Paper_Results
{
   public string Color { get; set; }
   public int Height { get; set; }
   public int Width { get; set; }
}

Я хочу использовать этот класс как модель предметной области. Теперь предположим, что я создаю класс, производный от Paper_Results, с добавленным интерфейсом.

public class Construction_Paper : Paper_Results, IMeasurementType
{
    [Required]
    public (new?) string Color { get; set; }
    [Required]
    [Range(1, Int32.MaxValue, ErrorMessage = "Value should be greater than or equal to 1")]
    public (new?) int Height { get; set; }
    [Required]
    [Range(1, Int32.MaxValue, ErrorMessage = "Value should be greater than or equal to 1")]
    public (new?) int Width { get; set; }
    public virtual string MeasurementType
    {
       get { return "inches"; }
    }
}

Теперь, когда я создаю свою ViewModel, вместо этого я буду использовать производный класс:

public class Construction_Paper_ViewModel
{
   Construction_Paper cp;
   List<Construction_Paper> cpList;
   string title;

   public Construction_Paper_ViewModel()
   {
       title = "Construction Paper";
       cp = new Construction_Paper();
       cpList = new List<Construction_Paper>();
   }
}

Я знаю, что должен использовать uint вместо int для неотрицательных целых чисел, но я просто хотел добавить в код больше аннотаций данных. Я спрашиваю, как лучше всего использовать метод ООП для получения класса Paper_Result, чтобы мне вообще не приходилось его изменять. Причина в том, что если я создаю новое решение и/или проект, я не хочу вносить в него какие-либо изменения при его автоматическом восстановлении с помощью Entity Framework. Стоит ли использовать затенение? Или новое ключевое слово в производном классе? Или у вас есть другие идеи получше?

Автоматически сгенерированные модели EF не содержат слова «виртуальный» в своих методах, поэтому я упомянул затенение и новое ключевое слово.


person Andy Narain    schedule 24.09.2014    source источник


Ответы (1)


Во-первых, не все проблемы следует решать с помощью наследования.

Во-вторых, платформа .NET уже имеет механизм добавления метаданных (атрибутов) к существующему объекту. Они называются классами друзей и используют класс MetadataTypeAttribute.

Идея состоит в том, что вы добавляете к классу атрибут, который позволяет указать другой класс, который используется для определения метаданных для исходного класса. Это не красиво, но это делает работу.

person Erik Funkenbusch    schedule 25.09.2014
comment
Спасибо. Можете ли вы также добавить дополнительные свойства/методы? Я предполагаю, что вы можете. - person Andy Narain; 25.09.2014
comment
@AndyNarain - у вас есть несколько вариантов, вы можете сделать класс Partial, чтобы добавить к нему дополнительные элементы ... но помните, что наследование определяет отношение «является». Его не следует использовать просто для сохранения нажатий клавиш. - person Erik Funkenbusch; 25.09.2014
comment
Вот что я в итоге сделал. Я создал класс друзей с одним дополнительным свойством. - person Andy Narain; 26.09.2014