You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EF保存Reservation实体时抛出Room代理类转String类型转换异常

异常原因

核心问题是Entity Framework(EF)的实体数据注解配置错误:
你在Reservation实体类中,将仅适用于字符串类型的[StringLength(20)]校验特性,错误标记到了Room类型的导航属性上。
public virtual Room Room { get; set; }是关联Room实体的导航属性,属性值是Room类的实例(EF启用延迟加载时会生成动态代理类实例,就是报错信息里的Room_D41B8366...类型),不是字符串值。EF执行保存前的实体验证逻辑时,会尝试读取这个属性值做字符串长度校验,自然会抛出无法将Room代理对象转换为System.String的类型转换异常。
同时你的代码没有显式配置外键字段ID_Room和导航属性Room的关联关系,也容易引发EF映射逻辑混乱。

修复方案

按以下步骤调整即可:

  • 移除导航属性上的错误注解,显式配置外键关联
    打开Reservation类文件,首先引入外键配置所需的命名空间:
using System.ComponentModel.DataAnnotations.Schema;

然后修正ID_Room、Room相关属性的定义,删掉Room属性上的[StringLength(20)],添加外键关联特性,Customer相关属性也建议同步配置避免同类问题:

[StringLength(20)]
public string ID_Room { get; set; }
[StringLength(20)]
public string ID_Customer { get; set; }

[ForeignKey("ID_Room")] // 显式指定Room导航属性对应外键为ID_Room字段
public virtual Room Room { get; set; }
[ForeignKey("ID_Customer")] // 同步配置Customer导航属性的外键关联
public virtual Customer Customer { get; set; }
  • 检查赋值逻辑
    你当前直接给外键字段ID_Room赋值文本框输入的房间号字符串的写法是合法的,EF会自动根据外键值处理关联关系,不需要额外给Room导航属性赋值。如果后续需要直接赋值导航属性,要先根据输入的房间号从数据库查询出对应的Room实体实例,再赋值给objReservation.Room,禁止将字符串直接赋值给实体类型的导航属性。
  • 重新编译项目后执行保存操作,异常即可消除。

内容的提问来源于stack exchange,提问作者Kaito

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 05:18:29