根据类型(列)映射到集合

Mapping to the collection based on the type (column)

我有三个实体:Series、Argument、ArgumentType

public class Series : Entity<int>
{
    public string Name { get; set; }

    public DateTime CreateDateTime { get; set; }

    public DateTime? ChangeDateTime { get; set; }

    public virtual ICollection<Argument> Arguments { get; set; }

    //public virtual ICollection<Argument> LambdaArguments { get; set; }
    //public virtual ICollection<Argument> GradientArguments { get; set; }
}

public class Argument : Entity<int>
{
    public ArgumentType Type { get; set; }
    public Series Series { get; set; }
    public int Value { get; set; }
}

public class ArgumentType : Entity<int>
{
    // 'Lambda', 'Gradient' etc.
    public string Code { get; set; }
}

我想知道是否有可能以及如何映射 Series 实体可以包含每个参数的集合 ArgumentType本身:

public virtual ICollection<Argument> LambdaArguments { get; set; }
public virtual ICollection<Argument> GradientArguments { get; set; }

我得到了映射文件:

public class SeriesMap : BaseMap<Series, int>
{
    public SeriesMap()
    {
        Property(x => x.Name).IsRequired();
        Property(x => x.CreateDateTime).IsRequired();
        Property(x => x.ChangeDateTime).IsOptional();

        HasMany(x => x.Arguments);
    }
}

public class ArgumentMap : BaseMap<Argument, int>
{
    public ArgumentMap()
    {
        Property(x => x.Value).IsRequired();
        HasRequired(x => x.Series);
        HasRequired(x => x.Type);
    }
}

public class ArgumentTypeMap : BaseMap<ArgumentType, int>
{
    public ArgumentTypeMap()
    {
        Property(x => x.Code);
    }
}

您可以使用 this inheritance model(Table 每个层次结构)来实现此目的。您最终会得到这些模型:

public abstract class Argument : Entity<int>
{
    public ArgumentType Type { get; set; }
    public Series Series { get; set; }
    public int Value { get; set; }
}

public class GradientArgument: Argument 
{
    //..extra properties
}

public class LambdaArgument: Argument 
{
    //..extra properties
}

映射:

public class ArgumentMap : BaseMap<Argument, int>
{
    public ArgumentMap()
    {
        Property(x => x.Value).IsRequired();
        HasRequired(x => x.Series);
        HasRequired(x => x.Type);
         Map<Argument>(m => m.Requires("Type").HasValue("Course"))
            .Map<GradientArgument>(m => m.Requires("Type").HasValue("GradientArgument"))
            .Map<LambdaArgument>(m => m.Requires("Type").HasValue("LambdaArgument"));
    }
}

然后您可以将任一参数类型附加到您的 Series 实体。您必须强制转换类型才能检索任何自定义属性。