自动检索实体框架外键关系模型

Posted

技术标签:

【中文标题】自动检索实体框架外键关系模型【英文标题】:Retrieve Entity Framework Foreign Key Relationship Models automatically 【发布时间】:2021-12-20 14:13:24 【问题描述】:

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

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; 
    

我在 Restaurant 和 Table 之间存在依赖关系:

以下是 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 的关系以识别它。我试图在网上查看如何做到这一点,咨询有关设置外键关系的指南等。由于缺乏基本知识,我无法找到我正在寻找的信息。我能找到的答案对我来说没有意义,因为我不明白他们在做什么或他们是如何做到的。

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

【问题讨论】:

你用的是什么ef版本和net版本? @Serge Net 5.0 和 EF 5.0.11 如果您使用的是 .NET 5.0 (= .NET "Core" 5.0) - 您可能会使用 EF CORE v5。 0.11 - 对吧?? 【参考方案1】:

为你的类添加关系

    [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

删除旧的迁移文件夹并干净迁移到数据库

之后你可以试试这段代码进行测试

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

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

【讨论】:

你好 Serge,我试过你的答案。我无法将“虚拟”关键字添加到餐厅类中的 ICollection。它指出该字段不能是虚拟的。当我尝试检索餐厅时,我收到一条错误消息,指出:“InvalidOperationException:表达式 'r.Tables' 在 'Include' 操作中无效,因为它不代表属性访问:'t => t.MyProperty '。要定位在派生类型上声明的导航,请使用强制转换 ('t => ((Derived)t).MyProperty') 或 'as' 运算符 ('t => (t as Derived).MyProperty')。" @shinyshark 感谢您的反馈。我很抱歉这是一个错字。替换为公共虚拟 ICollection
表 get;设置; 谢谢你,Serge,成功了!有没有我可以研究为什么这有效的来源?我很高兴它成功了,但我想知道我以后如何才能再次做到这一点。不客气!主文在这里docs.microsoft.com/en-us/ef/core/modeling/…

以上是关于自动检索实体框架外键关系模型的主要内容,如果未能解决你的问题,请参考以下文章

一对多关系不会在实体框架中检索数据

在 Hibernate 中,如何自动检索父 id 并在子插入中将其用作外键?

Hibernate的注解和检索

如何使用Django中的外键关系中的任何/ exists / all逻辑检索查询集?

Laravel - 从刀片视图中的模型关系中检索属性

C#:更改实体框架的检索数据类型