在实体框架中获取实体及其相关数据时的主键与外键

时间:2019-05-02 17:27:47

标签: entity-framework tsql indexing

如果我有四个表RecordProducts,Records,Products和被告,而RecordProducts具有这些值作为其他三个表的ID。

RecordProductsId,
RecordId,
ProductId,
DefendantId

当我运行实体框架查询以获取RecordProduct和record.Name,product.Name,defantant.Name时 并且我的查询进行了联接,如果有的话,在性能上有什么区别

  1. RecordId,ProductId和DefendantId上没有索引吗?
  2. 三个上的主键索引为一?
  3. Recordli和ProductId上的
  4. 单个外键
    • 我知道外键不是聚簇索引,但这在这里有所不同

作为一个例子,我的查询看起来像这样

var recordProducts = context.RecordsProducts
            .Where(rp => rp.RecordId == input.RecordId && rp.IsActive == true)
            .Include(rp => rp.Record)
            .Include(rp => rp.Product)
            .Include(rp => rp.Defendant);

var recordProductsVM = recordProducts.Select(rp => new GetRecordProductsViewModel
        {
            Id = rp.Id,
            RecordName = rp.Record.Name ,
            ProductName = rp.Product.Name ,
            DefendantName = rp.Defendant.Name,
            ...
        });

1 个答案:

答案 0 :(得分:0)

在记录产品ID上保持关系,PK,在产品,记录和被告上保持FK。在性能方面,SQL会很好地处理它。替代方法是使用组合键代替RecordProductID。我个人不喜欢使用它们,因为复合记录本身通常可以成为值得单独识别的有价值的实体。即针对此特定组合操作时,可以传递1x ID与3x ID。

使用Select将实体简化为视图模型时(很高兴看到!),您无需使用Include。 EF将构建SQL并根据所需数据在表上进行联接。