Присвойте другой тип указанному c типу - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть базовый класс, унаследованный несколькими классами

public class Animal
{
    public int Id { get; set; }

    public static Animal Get(int id)
    {
        return ...
    }
}

public class Cat : Animal
{
    public CatPayload Payload { get; set; }
}

public class Dog : Animal
{
    public DogPayload Payload { get; set; }
}

public class CatPayload
{
    public int Lives { get; set; }
}

public class DogPayload
{
    public bool IsDangerous { get; set; }
}

Я храню только Animal идентификатор в базе данных, поэтому, когда я получаю его с помощью метода stati c, я получаю экземпляр Animal и я не могу получить строго типизированный экземпляр Payload. Как лучше всего это осуществить? Единственная вещь, которую я сейчас имею в виду, это проверка типа экземпляра животного, если он соответствует какому-либо из подклассов, но я не уверен, есть ли какой-нибудь более простой способ?

Ответы [ 2 ]

1 голос
/ 13 апреля 2020

1) Наследование поддерживается в EF. В этом руководстве показано, как это можно сделать:

Учебник. Реализация наследования с EF в приложении ASP. NET MVC 5

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

public class Cat
{
    public int AnimalId { get; set; }

    [ForeignKey(nameof(AccountId))]
    public Animal Animal { get; set; }

    public CatPayload Payload { get; set; }
}

3) Для полезной нагрузки вы можете использовать строковое свойство для персистентности, содержащее json из сериализованный класс:

[NotMapped]
[JsonIgnore]
CatPayload Payload { get; set; }

public string PayloadJson
{
    get => Payload == null ? null : JsonConvert.SerializeObject(Payload);
    set => Payload = value == null ? null : JsonConvert.DeserializeObject<CatPayload>(value);
}
1 голос
/ 13 апреля 2020

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

Вы можно легко проверить с помощью сопоставления с образцом:


// Creates a Cat, casts to an animal type
Animal myAnimal = new Cat(3);

if(myAnimal is Cat castedAnimalToCat)
{
   // myCat is Animal returned true, which means we have a cat object.
   // castedAnimalToCat is now a new variable of type Cat
   Console.WriteLine($"{castedAnimalToCat.CatPayload}");
}

if(myAnimal is Dog castedAnimalToDog)
{
  // ...
}

Так что где-то в вашей логике базы данных c вы можете привести это к нужному операнду. Вы можете делать более причудливые вещи с помощью рефлексии, но с этим вы всегда заботитесь о безопасности времени и сложности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...