EF Core - 根据类型将通用属性映射到不同的表列

问题描述 投票:0回答:0

是否可以有条件地将通用属性(下例中的 Datapoint.Value)映射到相应类型的表列?最终,我需要一种在数据库中保存泛型类型的方法。支持的类型都是 EF 原语。

鉴于以下情况:

public interface IDatapoint
{
    int Id { get; set; }
    DateTimeOffset Timestamp { get; set; }
    DataTypes DataType { get; set; }
}

public class Datapoint<T> : IDatapoint
{
    public int Id { get; set; }
    public T Value { get; set; }
    public DateTimeOffset Timestamp { get; set; } = DateTime.Now;
    public DataTypes DataType { get; set; }
}

public enum DataTypes
{
    Boolean,
    String,
    Integer,
    Float,
}

使用方法:

var datapoints = new List<IDatapoint>
{
    new Datapoint<bool> { DataType = DataTypes.Boolean, Value = true },
    new Datapoint<string> { DataType = DataTypes.String, Value = "Sample Text" },
    new Datapoint<int> { DataType = DataTypes.Integer, Value = 42 },
    new Datapoint<float> { DataType = DataTypes.Float, Value = 3.14f }
};

数据库上下文:

public DbSet<IDatapoint> Datapoints { get; set; }

modelBuilder
    .Entity<IDatapoint>()
       .HasDiscriminator<string>("type")
       .HasValue<Datapoint<bool>>("bool")
       .HasValue<Datapoint<int>>("int")
       .HasValue<Datapoint<string>>("string")
       .HasValue<Datapoint<float>>("float");

通常,这是使用具有继承的单独类类型来实现的。是否可以从一个类(数据点)中完成所有这些?

理想情况下,该表将包含以下列:Id、Timestamp、DataType、Value_bool、Value_int、Value_string、Value_float。

c# entity-framework-core .net-7.0 ef-core-7.0
© www.soinside.com 2019 - 2024. All rights reserved.