# 存ID显示名字

# 功能概述

存ID显示名称是一种常见的应用开发需求,用于在数据库中存储关联对象的ID,而在界面上显示该对象的友好名称。

# 一、示例分析:设备维修模块

# 功能表现

  • 访问路径:应用中心 → 设备维修模块
  • 业务场景:填写维修单时需要选择具体设备
  • 核心需求
    • 存储时:保存设备ID
    • 显示时:显示设备名称和编号

# 实际操作演示

  • 添加维修记录时,选择具体的设备(如"野马水泵")
  • 关键观察
    • 列表显示:设备名称(野马水泵)、设备编号(9876)
    • 数据库存储:仅存储设备ID(DeviceId)

# 数据库验证

位置WebApps数据库 → app_sample_device_repair

查询结果

-- 查询设备维修表实际存储内容
SELECT * FROM app_sample_device_repair
  • 表中只有DeviceId字段(存储设备ID)
  • 没有设备名称和设备编号字段
  • 显示信息通过关联查询获得

# 二、实现步骤

# 第一步:实体类包含关联实体

位置Apps/Entities/SampleDeviceRepair.cs

关键代码

// 在SampleDeviceRepair实体类中包含Device子实体
public SampleDevice Device { get; set; }

说明:在实体结构中声明与其他实体的关联关系。

# 第二步:Controller包含关联数据

位置Controllers/SampleDeviceRepairController.cs

关键代码

// 重写查询方法,包含关联实体
protected override IQueryable<SampleDeviceRepair> GetQueryable()
{
    return dbContext.SampleDeviceRepairs
        .Include(x => x.Device);// 关键:包含Device信息
}

作用

  • 使用Include(x => x.Device)告诉EFCore查询时包含关联数据
  • 如果不加这句,即使实体类有Device属性,查询结果也不会包含Device信息

验证方法

  1. 浏览器按F12打开调试工具
  2. 刷新设备维修列表
  3. 查看list服务返回数据
  4. 确认数据中包含Device子实体详细信息
{
    "children": [{
        "Id": "xxx",
        "DeviceId": "设备ID",
        "Device": {
            "Id": "设备ID",
            "DeviceName": "野马水泵",
            "InternalCode": "9876"
        }
    }]
}

# 第三步:前端绑定关联字段

位置wwwroot/Apps/samples/DeviceRepair.js

关键代码

// 在列表列定义中绑定到关联实体的字段
columns: [
    { text: '设备名称', dataIndex: 'Device.DeviceName', width: 150 },
    { text: '设备编号', dataIndex: 'Device.InternalCode', width: 150 },
    { text: '维修内容', dataIndex: 'RepairSubject', width: 150 }
]

说明:使用dataIndex: 'Device.DeviceName'格式绑定到关联对象的字段

# 三、核心原理与完整流程

# 数据流向

用户界面 → 显示设备名称
        ↓
前端绑定 → Device.DeviceName
        ↓
服务返回 → JSON包含Device对象
        ↓
查询优化 → Include关联查询
        ↓
数据库层 → 存储DeviceId

# 完整实现流程

三个主要步骤

  1. 实体声明:在实体类中包含关联实体属性
  2. 服务配置:在控制器中使用Include包含关联数据
  3. 前端绑定:在界面上绑定到关联实体的显示字段

补充

  • 表单设计时:
    • 需配置设备选择控件,存储ID而非名称
    • 存储映射到DeviceId字段
    • 显示时从关联对象获取名称
  • 参考示例:
    • 实体类:SampleDeviceRepair.cs
    • 控制器:SampleDeviceRepairController.cs
    • 前端界面:DeviceRepair.js

# 四、应用价值

  • 数据一致性:通过ID关联确保数据引用正确
  • 用户体验:显示有意义的名称而非无意义的ID
  • 维护便利:设备信息更新时,所有关联记录自动更新显示
  • 存储效率:只存储ID,减少数据冗余

总结:存ID显示名称功能通过实体关联、查询包含和前端绑定三个关键步骤实现,是关联数据管理的基础模式,可应用于各种需要关联显示的业务场景。