Entity Framework 6个复合键(日期时间+外键)

Entity Framework 6 composite key (DateTime + foreign key)

我必须将以下实体存储在数据库中:

其中每个设备都有一个或多个测量点。测量值 table 将每 10 分钟存储一次每个测量点的值。这个 table 几年后将有数百万条记录,必须可以通过测量点和时间戳进行有效搜索。您将如何使用 EF6 Code-First 设计它?

我的第一个方法是:

public class Device
{
    public int ID { get; set; }

    public int DeviceNumber { get; set; }

    ...

    public virtual ICollection<MeasuringPoint> MeasuringPoints { get; set; } 
}

public class MeasuringPoint
{
    public int ID { get; set; }

    public int MeasuringPointNumber { get; set; }
    ...

    // Foreign key 
    public int DeviceID { get; set; }

    public virtual Device Device { get; set; } 
}

public class MeasuredValue
{
    //public int Id  { get; set; } ????

    public DateTime TimeStamp { get; set; }

    // Foreign key 
    public int MeasuringPointID { get; set; }

    public double Value;

    public virtual MeasuringPoint MeasuringPoint { get; set; } 
}

测量值 table 中的所有值在 TimeStamp 和 MeasuringPointID 的组合中必须是唯一的。我应该为 MeasuredTable 定义什么主键?

这并非唯一 code_first/EF 相关。

对于 EF,您可以选择一个 PK 来创建集群索引。然后你 may/must 为查询创建特定的索引

恕我直言,你可以:

  • 使用身份 pk(更快的插入)
    • 创建(覆盖)索引(点、日期)
    • 创建(覆盖)索引(日期、点)
  • 使用 pk(点,计数器),其中计数器是身份或类似 (max for point) + 1 的东西,甚至是日期(但如果 2 个测量值在同一毫秒内怎么办?)。
    • 创建索引(日期、点)

根据您的事务和并发压力,max解决方案可能很难实施。

在最后一种情况下,您的配置如下:

public class MeasuredValueConfiguration : EntityTypeConfiguration<MeasuredValue>{
    public MeasuredValueConfiguration()
        : base() {
        /* ... */

        HasKey(e => new {e.MeasuringPointID, e.Id});           

        /* ... */
    }
}