C# 一对零或一关系,使用子类型

C# 一对零或一关系,使用子类型,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我有一个大型应用程序,在系统中有许多下拉字段,只有一小部分值。为这些值中的每一个设置一个表,并为每个下拉类型设置一个单独的页面来处理crud,这并不值得。我所做的是制作一个下拉列表,它有一个鉴别器列来辨别它是哪种类型的下拉列表 我通过创建一个从下拉类派生的类来定义代码中的每个类型 我的CRUD管理器能够使用反射来允许用户向任何下拉列表添加值 到目前为止还不错 现在我希望能够扩展一个特定的下拉列表,这样它就可以拥有其他下拉列表所没有的属性 例如,付款条件列表。我想为存款百分比添加一个字段,以便我可

我有一个大型应用程序,在系统中有许多下拉字段,只有一小部分值。为这些值中的每一个设置一个表,并为每个下拉类型设置一个单独的页面来处理crud,这并不值得。我所做的是制作一个下拉列表,它有一个鉴别器列来辨别它是哪种类型的下拉列表

我通过创建一个从下拉类派生的类来定义代码中的每个类型

我的CRUD管理器能够使用反射来允许用户向任何下拉列表添加值

到目前为止还不错

现在我希望能够扩展一个特定的下拉列表,这样它就可以拥有其他下拉列表所没有的属性

例如,付款条件列表。我想为存款百分比添加一个字段,以便我可以使用它来计算存款

我的目标是将所有值存储在一个表中,类似于下拉值的存储方式

在SQL中,我只需要一个名为DropDownExtendedProperties的表,其中包含字段:DropDownID、PropertyName、PropertyValue,DropDownID将扩展属性链接到它附带的下拉值

在C/EF中,我能够使用1到0或1获得正确的数据库结构,但是一旦我创建了DropDownExtendedProperty的子类型,DropDownType就与该子类型的表建立了直接关系

我试着愚弄一对多,但除了从下拉表中拉出需要扩展属性的类型并创建它们自己的表&CRUD之外,我看不到解决方法。我知道在这一点上,这实际上是一个更简单的解决方案,但我认为我正在尝试做的应该是可能的,我只是不知道怎么做

我在下面包含了一些代码,但我尝试了几种不同的方式来建立关系,我正在发布最新的尝试

public class DropDownExtendedProperty
{
    [Key]
    public int PropertyID { get; set; }

    [ForeignKey("DropDown")]
    public int DropDownID { get; set; }

    public virtual DropDown DropDown { get; set; }

    public int? IntValue { get; set; }
    public string StringValue { get; set; }
    public FieldType FieldType { get; set; }
    public DateTime? DateValue { get; set; }
    public float? MoneyValue { get; set; }
}

public class DropDown
{
    [Key]
    public int ID { get; set; }
    [Required]
    public string Value { get; set; }

    public virtual List<DropDownExtendedProperty> ExtendedProperties { get; set; }

}

public class PaymentTerms : DropDown
{
    public virtual DaysToPay DaysToPay { get; set; }
}

public class DaysToPay : DropDownExtendedProperty
{

}

public enum FieldType
{
    Date,
    String,
    Int,
    Money
}

modelBuilder.Entity<DropDownExtendedProperty>()
            .HasRequired(a => a.DropDown)
            .WithMany();

我的目标是能够通过更抽象的DropDownExtendedProperty为每个具有特定类型的下拉列表定义单个值。因此,在我们的例子中,Net30的PaymentTerms下拉列表值可以在DaysToPay字段中附带一个int值,我可以在代码中使用该值进行计算。

下拉列表是下拉列表类型,如付款条件、订单类型、交货类型?DropDownExtendedProperty是每个下拉列表的选项值,就像付款条件一样,值是2周、30天和6个月?从一个下拉列表到多个DropDownExtendedProperty都很好,我看不出这里有什么问题..不,下拉类型包含它的值。所以net30、net60、COD值都存储在下拉列表中。我想做的是,对于某些下拉类型,PaymentTerms只是下拉列表的一个例子,添加一个额外的字段,允许我有另一个值,而不是用户在下拉列表中选择的值。因此,当他们选择Net30作为条款时,系统将知道在30天后,这笔款项将到期。我开始认为这在EF可能是不可能的。它需要使用DropDownID+Discriminator列来了解DaysToPay属性是什么。