是否可以有条件地将通用属性(下例中的 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。