# 存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信息
验证方法:
- 浏览器按F12打开调试工具
- 刷新设备维修列表
- 查看list服务返回数据
- 确认数据中包含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
# 完整实现流程
三个主要步骤:
- 实体声明:在实体类中包含关联实体属性
- 服务配置:在控制器中使用
Include包含关联数据 - 前端绑定:在界面上绑定到关联实体的显示字段
补充:
- 表单设计时:
- 需配置设备选择控件,存储ID而非名称
- 存储映射到
DeviceId字段 - 显示时从关联对象获取名称
- 参考示例:
- 实体类:SampleDeviceRepair.cs
- 控制器:SampleDeviceRepairController.cs
- 前端界面:DeviceRepair.js
# 四、应用价值
- 数据一致性:通过ID关联确保数据引用正确
- 用户体验:显示有意义的名称而非无意义的ID
- 维护便利:设备信息更新时,所有关联记录自动更新显示
- 存储效率:只存储ID,减少数据冗余
总结:存ID显示名称功能通过实体关联、查询包含和前端绑定三个关键步骤实现,是关联数据管理的基础模式,可应用于各种需要关联显示的业务场景。
← 开发第一个应用 表单提交时如何附加业务处理 →