Наследование по сравнению со ссылкой на другой класс внутри моего приложения asp.net mvc & Entity framework

Я работаю над веб-приложением asp.net mvc. и я определил много классов моделей представлений, которые ссылаются на отдельные классы моделей из разных источников, как показано ниже (где я добавляю к этим классам постфикс со словом «Присоединиться»), поскольку они объединяют отдельные классы моделей, которые определены в другой таблице БД: -

public class ServerJoin : IValidatableObject
{
    public Server Server { get; set; }
    public Resource Resource { get; set; }
    public Technology Technology { get; set; }
    public SDOrganization Site { get; set; }
    public SDOrganization Customer { get; set; }
    public NetworkInfo NetworkInfo { get; set; }
    public ICollection<NetworkInfo> NetworkInfo2 { get; set; }
    [Display(Name="Unique")]
    public bool IsMACUnique { get; set; }
    [Display(Name = "Unique")]
    public bool IsIPUnique { get; set; }
    public Nullable<double> SPEED { get; set; }
    public Nullable<Int64> PROCESSORCOUNT { get; set; }
    [Display(Name = "IP Unique")]
    public bool IsTIPUnique { get; set; }
    [Display(Name = "MAC Unique")]
    public bool IsTMACUnique { get; set; }
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (Server != null)
        {


            if (Server.RackUnitID != null && Server.RackID == null)
            {
                yield return new ValidationResult("Please select a Rack, or remove the current Rack Unit", new[] { "Server.RackUnitID" });
            }
        }
    }

}

и другой класс модели представления: -

public class VMJoin
{
     public VirtualMachine VirtualMachine { get; set; }
     public Resource Resource { get; set; }
     public Technology Technology { get; set; }
     public SDOrganization Site { get; set; }
     public SDOrganization Customer { get; set; }
     public NetworkInfo NetworkInfo { get; set; }
     public ICollection<NetworkInfo> NetworkInfo2 { get; set; }
     public ICollection<TechnologyIP> TechnologyIP { get; set; }
     [Display(Name = "Unique")]
     public bool IsMACUnique { get; set; }
     [Display(Name = "Unique")]
     public bool IsIPUnique { get; set; }
     public Nullable<double> SPEED { get; set; }
     public TechnologyIP TechnologyIP2 { get; set; }
     [Display(Name = "IP Unique")]
     public bool IsTIPUnique  { get; set; }
     [Display(Name = "MAC Unique")]
     public bool IsTMACUnique { get; set; }

}

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

public class GeneralClass
{
     public string ResourceName { get; set; }
     public string ResourceDesc { get; set; }
     public string ResourceType { get; set; }
}

теперь я не уверен, как я могу ссылаться на этот класс внутри моделей представления. я ищу способ определить этот класс как родительский класс и заставить другие классы (serverjoin и vmjoin) расширить этот GeneralClass?. другой вариант (который имитирует управление классами Entity framework) — просто добавить ссылку на GeneralClass внутри Serverjoin и VMjoin ?? так может ли кто-нибудь посоветоваться по этому поводу, пожалуйста?

Спасибо


person john Gu    schedule 26.04.2016    source источник
comment
EF будет обрабатывать наследование или композицию. Вам нужно решить, является ли ServerJoin GeneralClass (наследование) или ServerJoin имеет GeneralClass (состав). w3resource.com/java-tutorial/   -  person Steve Greene    schedule 26.04.2016
comment
@SteveGreene Мне нужно, чтобы это было, но я не уверен, как я буду расширять свое соединение с сервером в этом случае, поскольку оно уже расширяет IValidatableObject?   -  person john Gu    schedule 26.04.2016


Ответы (1)


IValidatableObject — это интерфейс, поэтому вы можете использовать:

public class ServerJoin : GeneralClass, IValidatableObject
{
   ...
}

Я не уверен, что это имеет смысл с точки зрения ViewModel. Обычно я выполняю наследование в своих моделях сущностей, а затем сглаживаю их в своих моделях представления.

person Steve Greene    schedule 26.04.2016
comment
но как вы делаете наследование внутри ваших моделей сущностей? теперь я следую первому подходу БД, где я использую EF для сопоставления своих таблиц БД, и я никогда не получаю никакого типа наследования внутри моих автоматически сгенерированных классов моделей. первый подход... не уверен, как все работает при первом подходе кода. - person john Gu; 26.04.2016
comment
Вам нужно удалить отношения и добавить наследование. См. здесь: packtpub.com/books/content/ - person Steve Greene; 26.04.2016
comment
хорошо, спасибо за вашу ссылку, поэтому мой вопрос: получу ли я какие-либо преимущества, если я изменю то, как EF сопоставляет мои таблицы, чтобы иметь классы модели, подобные наследованию? или можно работать так, как EF отображает классы моделей с помощью композиций? - person john Gu; 27.04.2016
comment
У вас будут разные мнения, но я всегда придерживался композиции. Наследование добавляет сложности, а композиция кажется лучшей абстракцией для реляционных данных. - person Steve Greene; 27.04.2016
comment
так что можно оставить все как есть с композицией? что ты думаешь ? - person john Gu; 27.04.2016
comment
Я думаю, что да, если нет множества производных дочерних классов. - person Steve Greene; 27.04.2016