EF 6迁移至EF Core 8遇阻:Set(Type)方法不再被支持
适配EF Core 8的修改方案
EF Core 8中确实移除了DbSet的Create()方法,虽然DbContext.Set(Type entityType)仍可调用,但无法再通过它执行实体创建操作。针对你的代码,提供两种适配方案:
方式一:直接创建实体实例(简单场景)
如果不需要EF的懒加载代理,直接用Activator.CreateInstance实例化实体即可,行为和普通对象实例化一致:
private Type DataModelType; public virtual object Create() { DbContext dbContext = this.GetDbContext(); // 直接创建实体实例 object obj = Activator.CreateInstance(DataModelType); // 若需和原EF6 Create()行为类似、将实例关联到上下文,可添加以下代码(可选) // dbContext.Add(obj); return obj; }
方式二:创建EF代理实例(兼容懒加载)
如果需要保留EF6中Create()创建代理实例(支持懒加载)的行为,可通过反射调用EF Core的CreateProxy泛型方法:
private Type DataModelType; public virtual object Create() { DbContext dbContext = this.GetDbContext(); // 反射获取CreateProxy泛型方法并构造对应Type的版本 var createProxyMethod = typeof(DbContext).GetMethod(nameof(DbContext.CreateProxy), Type.EmptyTypes); var genericCreateProxy = createProxyMethod.MakeGenericMethod(DataModelType); // 调用方法创建代理实例 object obj = genericCreateProxy.Invoke(dbContext, null); return obj; }
注意事项
使用代理实例需满足两个前提:
- 已在DbContext配置中启用懒加载代理:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseLazyLoadingProxies(); } - 实体类符合代理要求:
public访问修饰符、拥有public无参构造函数、导航属性标记为virtual。
内容的提问来源于stack exchange,提问作者user3424480
相关产品推荐
相关产品推荐

