所以,我有一个系统可以记录来自不同设备的不同类型的值。每个设备都可以提供应记录的多个值。
我需要描述每个设备,连接到设备的每个传感器的描述,传感器提供的不同类型值的描述(例如深度传感器的压力和温度),最后记录的集合每一个的价值再次。到目前为止我所尝试的是类似于:
// The device which the sensor is connected to
public class Device
{
public int DeviceId { get; set; }
public string Name { get; set; }
}
// A sensor that is connected to a Device.
public class Sensor
{
public int SensorId { get; set; }
public int DeviceId { get; set; }
public string Name { get; set; } // for example "Depth"
public ICollection<SensorValueDescription> ValueDescriptions { get; set; }
}
// A description of a single value provided by a sensor (Such as "Degrees Celcius")
public class SensorValueDescription
{
public int SensorId { get; set;}
public int SensorValueDescriptionId { get; set; }
public string Unit { get; set; } // for example "Bar or Degrees Celcius"
public ICollection<SensorValue> SensorValues { get; set; }
}
// A single measurement
public class SensorValue
{
public int SensorValueDescriptionId { get; set; }
public int SensorValueId { get; set; }
public DateTime Timestamp { get; set; }
public object Value { get; set; } // <-- This is the problem
}
这在.net中运行良好。我可以在SensorValue.Value
中设置任何类型的值,然后读取类型并对此执行某些操作。
但是,尝试将此代码与Entity Framework一起使用时,不会为此属性创建任何列。
在一个DbContext中创建和保存带有传感器,SensorValueDescriptions和SensorValues的新设备到数据库,并在另一个DbContext中读回它们时,一切看起来都很好,除了SensorValueDescription.SensorValues
始终为空。
我尝试使用Generics而不是使用object
- 属性来制作解决方案,但我也没有做到这一点。
然后我开始思考如何在数据库中尝试模拟这样的东西,并且有点简短。
我想过要有不同的&#34;价值表&#34;对于每个不同的值类型:FloatValues,DoubleValues,StringValues,IntegerValues等,它们有一列用于时间戳,一列用于值。但是这会创建许多不同的表,我会以某种方式根据值的类型加入不同的表名。
然后我开始考虑像稀疏表一样对其进行建模,其中我为每个值类型都有一个列,但只有具有正确类型的列才会填充给定的行。但是,这似乎在我的.net代码中使用会很痛苦。
更糟糕的是,某些传感器可以返回一个样本,该样本是任何支持类型的数组。
对于这样的事情,什么是好的解决方案?从理论上讲,手头的任务看起来很简单,但我找不到一个好的解决方案。