Entity Framework 配置外键关联实现自动加载关联TableModel数据
问题排查与修复方案
现有配置的错误点
- 错误1:
RestaurantModel中的Tables成员加了[NotMapped]特性,该特性会告知Entity Framework完全忽略该成员,不做数据库映射也不做关联加载。同时该成员是字段而非属性,EF Core仅支持映射属性,需要补充get; set;访问器。 - 错误2:
TableModel中外键配置错误,[ForeignKey("restaurant_id")]的参数应为关联导航属性的名称,若要指定数据库中外键列的名称,应使用[Column("restaurant_id")]特性。 - 错误3:
OnModelCreating中的关联配置不完整,仅声明了TableModel有一个关联的RestaurantModel,但没有指定外键关联关系,也没有绑定RestaurantModel侧的Tables集合导航属性。
正确配置步骤
第一步:修改实体类代码
namespace Restaurant.Models { [Table("Restaurant")] public class RestaurantModel { [Key] [Column("id")] public int Id { get; set; } [Column("name")] public string Name { get; set; } [Column("telephone_number")] public int TelephoneNumber { get; set; } // 移除[NotMapped],改为带访问器的属性 public List<TableModel> Tables { get; set; } public RestaurantModel() { Tables = new List<TableModel>(); } } }
namespace Restaurant.Models { [Table("Table")] public class TableModel { [Key] [Column("id")] public int Id { get; set; } [Column("restaurant_id")] // 指定数据库列名 [Required] public int RestaurantId { get; set; } // 可选添加:导航属性,方便从Table侧关联查询Restaurant public RestaurantModel Restaurant { get; set; } [Column("available_seats")] public int AvailableSeats { get; set; } [Column("is_indoors")] public bool IsIndoors { get; set; } } }
第二步:修改Context的关联配置
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<RestaurantModel>().ToTable("Restaurant"); modelBuilder.Entity<TableModel>().ToTable("Table"); modelBuilder.Entity<GuestModel>().ToTable("Guest"); // 完整配置一对多关系 modelBuilder.Entity<TableModel>() .HasOne<RestaurantModel>(t => t.Restaurant) // Table侧的导航属性 .WithMany(r => r.Tables) // Restaurant侧的集合导航属性 .HasForeignKey(t => t.RestaurantId) // 绑定外键字段 .IsRequired(); }
第三步:查询时指定加载关联数据
EF Core默认不会自动加载关联数据,需要主动指定,常用方式为预加载:
// 用Include方法指定同步加载关联的Tables数据 var restaurant = _context.Restaurants .Include(r => r.Tables) .FirstOrDefault(r => r.Id == 目标餐厅ID);
如果需要访问属性时自动加载,可以额外配置懒加载代理即可。
内容的提问来源于stack exchange,提问作者shinyshark
相关产品推荐
相关产品推荐

