首页 > 解决方案 > 自动检索实体框架外键关系模型

问题描述

我正在开发餐厅应用程序。我有一个餐厅模型和一个餐桌模型。

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;
        
        public RestaurantModel()
        {
            Tables = new List<TableModel>();
        }
    }
}
namespace Restaurant.Models
{
    [Table("Table")]
    public class TableModel
    {
        [Key]
        [Column("id")]
        public int Id { get; set; }

        [ForeignKey("restaurant_id")]
        [Required] [NotNull]
        public int RestaurantId { get; set; }
        
        [Column("available_seats")]
        public int AvailableSeats { get; set; }
        
        [Column("is_indoors")]
        public bool IsIndoors { get; set; }
    }
}

我在餐厅和餐桌之间有依赖关系: 在此处输入图像描述

以下是 Entity Framework 通过我的上下文为我创建的列和键: 在此处输入图像描述

最后,这是我的 Context 类:

namespace Restaurant.Data
{
    public class RestaurantContext : DbContext
    {
        public RestaurantContext(DbContextOptions<RestaurantContext> options) : base(options)
        {
        }
        
        public DbSet<RestaurantModel> Restaurants { get; set; }
        public DbSet<TableModel> Tables { get; set; }
        public DbSet<GuestModel> Guests { get; set; }

        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>();
        }
    }
}

当我检索一家餐馆时,我希望在 TableModel 列表中检索相应的表。目前,当我检索餐厅时,它不会检索任何相应的表格。这对我来说很有意义,因为我没有正确连接 EntityFramework 的关系以识别它。我试图在网上查看如何做到这一点,咨询有关设置外键关系的指南等。由于缺乏基本知识,我无法找到我正在寻找的信息。我能找到的答案对我来说没有意义,因为我不明白他们在做什么或他们是如何做的。

谁能指出我正确的方向或告诉我我做错了什么?

标签: c#sqlentity-framework

解决方案


将关系添加到您的类

    [Table("Restaurant")]
    public class Restaurant
    {
        [Key]
        [Column("id")]
        public int Id { get; set; }
        
        [Column("name")]
        public string Name { get; set; }
        
        [Column("telephone_number")]
        public int TelephoneNumber { get; set; }
      
        public virtual ICollection<Table> Tables { get; set; }
        
    }
}

    [Table("Table")]
    public class Table
    {
        [Key]
        [Column("id")]
        public int Id { get; set; }

         
        public int? RestaurantId { get; set; }
         public virtual Restourant Restaurant { get; set; }

        [Column("available_seats")]
        public int AvailableSeats { get; set; }
        
        [Column("is_indoors")]
        public bool IsIndoors { get; set; }
    }
}

而且由于您使用的是 Net core 5+,我认为您没有任何导航属性或流畅的 API

删除旧的迁移文件夹并干净迁移到 db

在此之后,您可以尝试此代码进行测试

var restourant= context.Restourants.Include(r=> r.Tables).FirstOrDefault(r=>r.Id==id);

它应该返回一个带有表格列表的餐厅


推荐阅读