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

使用Entity Framework存储JSON数据时导航属性ICollection类型异常

解决Entity Framework保存时的导航属性异常问题

错误原因

Entity Framework要求集合类型的导航属性必须实现ICollection<T>接口(比如List<T>、HashSet<T>),而你的代码中DriverDetails属性使用的是IEnumerable<DriverDetails>,且赋值时直接用Select返回的SelectListIterator——它仅实现了IEnumerable,不满足EF对导航属性的类型要求,因此抛出异常。

修复步骤

1. 修改实体类的导航属性类型

将DriverInfo类中的DriverDetails属性类型从IEnumerable<DriverDetails>改为ICollection<DriverDetails>或List<DriverDetails>:

public class DriverInfo : IdEntityBase
{
    public virtual int DriverInfoId { get; set; }
    public virtual int BrandId { get; set; }
    public virtual ProposerDetails PropDetails { get; set; }
    // 改为ICollection或List,建议初始化空集合避免空引用
    public virtual ICollection<DriverDetails> DriverDetails { get; set; } = new List<DriverDetails>();
}

2. 赋值时转换为ICollection实现类

在实例化DriverInfo时,将Select的结果通过ToList()转换为List<DriverDetails>:

var driverInfo = new DriverInfo()
{
    BrandId = request.BrandId,
    ProposerDetails = new ProposerDetails()
    {
        DriverId = 1,
        PostalCode = request.PropDetail.PostalCode,
        LicenceNumber = request.PropDetail.LicenceNumber,
        InsuranceNumber = request.PropDetail.InsuranceNumber 
    },
    // 加上ToList()转换为符合要求的集合类型
    DriverDetails = request.Drivers.Select(x => new DriverDetails() 
    { 
        DriverId = x.Id,
        LicenceNumber = x.LicenceNumber,
        InsuranceNumber = x.NationalInsuranceNumber,
        PostalCode = x.PostalCode 
    }).ToList()
};
Repository.Save(driverInfo);

额外注意事项

  • 如果ProposerDetails是复杂类型(非独立实体),需要在DbContext中配置为Owned Entity,否则EF无法正确映射:
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<DriverInfo>().OwnsOne(d => d.PropDetails);
    }
    
  • 你给出的单表结构Id, BrandId, PropDetail, DriversDetail与当前实体的关联设计不匹配,若要映射到单表,可将PropDetails和DriverDetails的字段展开到DriverInfo表中,或使用数据库的JSON类型字段(如SQL Server的JSON类型)存储这两个属性,此时需要将实体属性改为字符串类型,并手动处理JSON的序列化与反序列化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 09:47:39