如何查询和操作Entity Framework Core生成的未映射DbSet的关联与泛型表
解决方案
完全可以通过EF Core实现需求,不需要使用原生SQL,可通过以下几种方式操作自动生成的泛型实体表:
方案1:显式注册DbSet(最直观)
直接在你的DbContext类中添加对应闭合泛型类型的DbSet属性即可:
public DbSet<EntityCategory<Person>> PersonCategories { get; set; } // 如果需要操作属性值表也可以加上 public DbSet<EntityAttributeValue<Person, EntityCategory<Person>>> PersonAttributeValues { get; set; }
添加后你就可以直接通过context.PersonCategories对分类表执行CRUD操作,和普通实体完全一致。
方案2:无需定义DbSet,直接调用Set方法
因为Person实体中已经包含了EntityCategory<Person>类型的导航属性,EF Core在模型构建阶段已经将该泛型闭合类型纳入实体模型,你不需要显式定义DbSet也可以通过Set<T>方法访问:
// 新增分类示例 using var dbContext = new YourDbContext(); var newCategory = new EntityCategory<Person> { Name = "行政人员", ReadOnly = false, OrderIndex = 1 }; dbContext.Set<EntityCategory<Person>>().Add(newCategory); dbContext.SaveChanges(); // 查询分类示例 var allCategories = dbContext.Set<EntityCategory<Person>>() .Where(c => !c.IsDeleted) .ToList();
可选优化:统一配置泛型实体表名
默认EF Core生成的泛型实体表名会包含<>等特殊符号,你可以在DbContext的OnModelCreating方法中统一配置所有泛型实体的表名规则,避免命名混乱:
protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // 批量配置所有EntityCategory<T>的表名 var entityTypes = modelBuilder.Model.GetEntityTypes() .Where(t => t.ClrType.IsGenericType && t.ClrType.GetGenericTypeDefinition() == typeof(EntityCategory<>)); foreach (var entityType in entityTypes) { var entityName = entityType.ClrType.GetGenericArguments()[0].Name; modelBuilder.Entity(entityType.ClrType) .ToTable($"EntityCategory_{entityName}"); } // 同理可以配置EntityAttributeValue的表名规则 }
多对多关联表操作提示
你提到的EntityCategory<Person>Person是EF Core自动生成的多对多关联表,一般不需要直接操作该表,通过Person.EntityCategories或者EntityCategory<Person>.Entities导航属性即可自动维护关联关系。
内容的提问来源于stack exchange,提问作者Marius Vasile
相关产品推荐
相关产品推荐

