EF6.4.4执行SaveChanges时报无法为HashSet设置MIXTURE属性异常
问题根因
Entity Framework 6 要求所有映射到数据库表的实体必须配置唯一主键,用于实体状态跟踪。你当前的STABILITY_ISSUES表未设置主键,EF无法正确识别实体的唯一标识,导致关联导航属性映射逻辑错乱,才会抛出尝试给HashSet集合类型设置MIXTURE属性的异常,该问题和你使用的集合类型(ICollection/HashSet/List)无关。
可行解决方案
方案1:可修改表结构(推荐)
直接给STABILITY_ISSUES表新增唯一主键列,从根源解决问题:
- 在SQL Server中给
STABILITY_ISSUES表新增自增主键列,比如命名为STABILITY_ISSUES_ID,设置为INT类型、自增、主键 - 同步修改
STABILITY_ISSUES实体类,新增主键属性:
public partial class STABILITY_ISSUES { // 新增主键属性 public int STABILITY_ISSUES_ID { get; set; } public int MIXTURE_ID { get; set; } public string STABILITY_ISSUES1 { get; set; } public virtual MIXTURE MIXTURE { get; set; } }
EF会自动识别命名为{实体类名}_ID的属性为主键,配置完成后即可正常调用SaveChanges。
方案2:不可修改表结构(仅临时兼容)
如果因为历史遗留问题无法调整表结构,可手动配置复合主键,只要MIXTURE_ID和STABILITY_ISSUES1两个字段组合起来没有重复值即可使用:
在你的DbContext类的OnModelCreating方法中添加如下配置:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { // 配置STABILITY_ISSUES的复合主键 modelBuilder.Entity<STABILITY_ISSUES>() .HasKey(t => new { t.MIXTURE_ID, t.STABILITY_ISSUES1 }); }
注意:如果
STABILITY_ISSUES1存在空值、或者两个字段组合有重复数据,该方案不生效,必须优先采用方案1新增唯一主键。
额外排查点
检查你的业务代码是否存在错误赋值的情况:不要将单个STABILITY_ISSUES实体直接赋值给MIXTURE.STABILITY_ISSUES集合属性,正确写法是调用mixture.STABILITY_ISSUES.Add(稳定性问题实体)添加数据。
内容的提问来源于stack exchange,提问作者inifus
相关产品推荐
相关产品推荐

