.NET Core 6 Razor Page无外键数据库实体关联配置求助
手动配置EF Core无外键的一对多关联解决方案
第一步:修改模型添加导航属性
先给两个模型添加对应的导航属性,EF Core需要通过这些属性识别关联关系:
Category模型更新后:
namespace MyWebApp.Models { public partial class Category { public int Id { get; set; } public string Code { get; set; } = null!; public string label{ get; set; } = null!; public bool Enable { get; set; } // 新增:一个分类对应多个文档的导航属性 public ICollection<Document> Documents { get; set; } = new List<Document>(); } }
Document模型更新后:
namespace MyWebApp.Models { public partial class Document { public int Num { get; set; } public string? Id { get; set; } public string? Codecat { get; set; } public DateTime? Datedoc { get; set; } public DateTime? Modified { get; set; } public DateTime? Datedel { get; set; } // 新增:一个文档对应一个分类的导航属性 public Category? Category { get; set; } } }
第二步:在DbContext中配置关联规则
找到你的项目DbContext类,重写OnModelCreating方法,手动指定关联的字段映射:
using Microsoft.EntityFrameworkCore; using MyWebApp.Models; namespace MyWebApp.Data { public class AppDbContext : DbContext { public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { } public DbSet<Category> Categories { get; set; } public DbSet<Document> Documents { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { // 配置Category与Document的一对多关联 modelBuilder.Entity<Document>() .HasOne(d => d.Category) // 文档属于一个分类 .WithMany(c => c.Documents) // 分类包含多个文档 .HasForeignKey(d => d.Codecat) // 文档侧的关联字段是Codecat .HasPrincipalKey(c => c.Code); // 分类侧的关联字段是Code // 保留脚手架生成的原有配置(如果有的话) base.OnModelCreating(modelBuilder); } } }
第三步:查询时加载关联数据
在Razor Page的后台逻辑中,查询数据需要用Include方法显式加载导航属性,才能获取关联的分类信息:
// 示例:查询所有带分类信息的文档 var documents = await _context.Documents .Include(d => d.Category) .ToListAsync();
注意事项
- 确保
Codecat和Code字段的数据类型完全一致(都是string),且数据库中Codecat的值能匹配到Category的Code值 - 如果数据库存在
Codecat无匹配的记录,查询时对应的Category会返回null,不会抛出异常 - 若之前脚手架生成过模型配置,不要覆盖原有代码,只需新增关联配置即可
内容的提问来源于stack exchange,提问作者Rodolphe
相关产品推荐
相关产品推荐

