EF Core实体改用ICollection后调用ToList()抛出类型不匹配异常
问题原因分析
这是因为EF Core在实体加载阶段,内部用于填充集合属性的PopulateList方法要求参数必须是IList<T>类型,而ICollection<T>接口本身并没有包含IList<T>特有的按索引访问、插入/删除元素等能力——如果你的实体集合属性声明为ICollection<T>,且初始化时用了不实现IList<T>的类型(比如HashSet<T>),EF Core尝试调用PopulateList时就会因为类型不匹配抛出异常。
具体拆解:
- 当你把集合属性改成
List<T>或IList<T>时,EF Core默认会实例化List<T>(它同时实现ICollection<T>和IList<T>),完全满足PopulateList的参数要求,所以不会报错。 - 调用
ToList()会立即触发EF Core执行查询并填充实体对象,这时候才会调用内部的集合填充逻辑;如果不调用ToList(),只是创建了IQueryable对象,还没进入实体填充阶段,自然不会触发异常。
另外注意:即使你把属性声明为ICollection<T>,如果初始化时用List<T>(比如public ICollection<int> Xxx { get; set; } = new List<int>()),也不会出现这个问题——因为List<T>本身实现了IList<T>,能被PopulateList方法接受。
内容的提问来源于stack exchange,提问作者BeniaminoBaggins
相关产品推荐
相关产品推荐

