我有多个类继承的基类
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
标识符,所以当我使用静态方法获取它时,我得到了Animal
的实例,而我却没有得到{{1}的强类型的实例}。实施此方法的最佳方法是什么?我目前唯一想到的就是检查动物实例的类型是否与任何子类匹配,但是我不确定是否有一些更简单的方法?
答案 0 :(得分:1)
我发现您的答案缺少一些细节,因此我不知道这是否有帮助,但否则,请用更多详细信息扩展您的答案,尤其是使用这些类的代码部分。
您可以轻松地通过模式匹配进行检查:
// 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)
{
// ...
}
因此,在您的数据库逻辑中,可以将其强制转换为正确的操作数。 您可以通过反射来做一些更奇妙的事情,但是您始终会担心时间安全性和复杂性。
答案 1 :(得分:1)
1)EF支持继承。本指南说明了如何完成此操作:
Tutorial: Implement Inheritance with EF in an ASP.NET MVC 5 app
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);
}