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
相关产品推荐
相关产品推荐

