首页 > 解决方案 > EF Core 完全忽略了我在选择中选择的属性

问题描述

据我了解,以下代码应生成一个仅包含RouteIdRouteNoShipId

        var tow = (from t in _context.AllTowData
                   where t.RouteId == id
                   orderby t.RouteNo descending
                   select new TowDefaults {
                       Id = t.RouteId,
                       TowNo = t.RouteNo,
                       ShipId = t.ShipId,
                       LastTow = t.RouteNo
                   })
            .FirstOrDefault();

但是,我得到:

SELECT v.route_id, v.route_no, v.tow_id, v.analysis_complete, v.checks_complete, v.cpr_id, v.date_created, v.date_last_modified, v.factor, v.fromportname, v.instrument_data_file, v.instrument_id, v.internal_number, v.mastername, v.message, v.miles_per_division, v.month, v.number_of_samples, v.number_of_samples_analysed_fully, v.prop_setting, v.route_status, v.sampled_mileage, v.serial_no_per_calendar_month, v.ship_speed, v.silk_reading_end, v.silk_reading_start, v.toportname, v.tow_mileage, v.validity, v.year
FROM view_all_tow_data AS v
WHERE v.route_id = '@__id_0'
ORDER BY v.route_no DESC
LIMIT 1

这是除了明确要求的每一列ShipId!我究竟做错了什么?

使用 SQL Server 和 PostGres 数据库会发生这种情况

标签: entity-framework-coreentity-framework-core-3.1

解决方案


该属性ShipId未通过[NotMapped]注释或映射指令映射。就EF而言,该属性不存在。这有两个效果:

  1. EF“注意到” final 有一个未知部分Select,它切换到客户端评估(因为它是 final Select)。这意味着:它将查询之前的查询转换Select为不包含该ShipId列的 SQL,执行它,并实现完整的AllTowData实体。
  2. 它评估Select客户端并返回具有默认值的请求TowDefaults对象ShipId,或您在 C# 代码中初始化的任何值,但数据库中没有任何值。

您可以通过在查询后检查来验证这一点_context.AllTowData.Local:它将包含所有AllTowData通过过滤器的实体。

从你的问题不可能告诉你应该做什么。也许您可以将属性映射到视图中的列。如果没有,您应该将其从 LINQ 查询中删除。在 LINQ 的任何地方但在 final 中使用它Select会导致运行时异常。


推荐阅读