我一直在不断修改我的代码,以便我使用实体框架处理单个表db结构的继承。通过单个表,我的意思是核心对象的每个属性都有一列,所有继承的属性都存储为名为params的列中的json对象。该对象将代表DB结构。
public class Parent
{
public string Name {get; set;}
public DateTime Created {get; set;}
protected ExpandoObject Params {get; set;}
public TypeEnum Type {get; set;}
}
我从数据库中提取1个父级,但我不知道它的类型。我需要先将它解析为Parent对象,然后读取Type属性以确定它是什么。从这里我可以将其转换为正确的类型。我已经尝试了很多方法来处理这个问题,我认为我已经提出了最简洁的方法,但它导致必须在getter中进行一些解析和数据转换。这是一个例子。
public class Child : Parent
{
public int ChildID{
get {
return Convert.ToInt32(this.Params.ChildID);
}
set {
this.Params.ChildID = value;
}
}
public SomeEnum SomeOtherType{
get {
return (SomeEnum)Convert.ToInt32(this.Params.SomeOtherType);
}
set {
this.Params.SomeOtherType = value;
}
}
}
这对我来说非常干净,因为它隐藏了实现的复杂性,同时也允许我轻松地将Child转换为Parent而不会丢失数据。我看到的问题是整数被存储为长整数,我需要将它们转换为int(它永远不需要很长)。对于枚举,它也是如此。这种数据处理在对象的getter中是否可以接受?我在这里看到的主要缺点是每次调用属性时都需要完成解析,但它并不太昂贵。如果这是一个可怕的做法,我该怎么做呢?
我已经考虑过的替代方案是