执行add-migration时遇IEnumerable类型错误,求技术排查帮助
嘿,我一眼就看出你遇到的这个add-migration错误的根源啦!错误提示里说的**"The entity type 'System.Collections.Generic.IEnumerable1[SomeModel]' provided for the argument 'clrType' must be a reference type."** 本质是EF Core完全不接受用IEnumerable
为啥会踩这个坑?
IEnumerable<T>只是个只读的枚举接口,它没有提供添加、删除元素的方法——但EF Core需要能跟踪集合的变更(比如给管理员新增一个请求、删除用户的某个请求),所以它要求导航属性必须是可修改的集合类型,比如ICollection<T>或者List<T>这类实现了ICollection接口的类型。
你的代码里的问题点
看看你的实体类就明白了:
Administrator里的ReceievedRequests用了IEnumerable<UserRequest>Customer里的UserRequests也用了IEnumerable<UserRequest>
这俩就是触发错误的直接原因。
修复步骤超简单
把导航属性换成可修改的集合类型
把所有IEnumerable<T>替换成ICollection<T>(推荐用接口保持抽象,或者用List<T>也可以),顺便初始化空集合避免后续空引用:public class Administrator : UserAccount { public ICollection<UserRequest> ReceievedRequests { get; set; } = new List<UserRequest>(); } public class Customer : UserAccount { public int Spent { get; set; } public ShoppingCart Cart { get; set; } public virtual ICollection<UserRequest> UserRequests { get; set; } = new List<UserRequest>(); }上下文配置不用改
你在OnModelCreating里的配置已经用了HasMany,这完全符合一对多关系的配置,改完属性类型后直接能用:protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Administrator>() .HasMany(r => r.ReceievedRequests); modelBuilder.Entity<Customer>() .HasMany(r => r.UserRequests); modelBuilder.Entity<UserRequest>() .HasAlternateKey(k => k.UserAccountId); }另外提一句,
UserRequest里把UserAccountId设为备用键的配置是没问题的,确保每个请求关联的用户ID唯一。重新跑迁移命令
现在再执行add-migration,应该就能顺利生成迁移文件啦!
额外小提示
- 导航属性加上
virtual关键字(你已经给Customer.UserRequests加了),这样EF Core可以启用延迟加载,按需加载关联数据,性能更友好。 - 初始化集合为
new List<T>(),能避免后续往集合里加数据时碰到NullReferenceException,省不少麻烦。
内容的提问来源于stack exchange,提问作者connecticut96

