如何在 Code First c# 中将多个实体引用为一个

Posted

技术标签:

【中文标题】如何在 Code First c# 中将多个实体引用为一个【英文标题】:how I can reference multiple Entity into one , in Code First c# 【发布时间】:2018-05-28 13:45:47 【问题描述】:

我有这两个课

   public class Category 
   
    public int Id get; set; 
    public string Name  get; set; 
   

   public class Filter
   
     public int Id get; set; 
     public string Name  get; set; 
   

我还有另一个这样的实体

public class Menu 

    public int Id get; set; 
    public string Name  get; set; 
    public MenuType MenuType  get; set; 

MenuType 就是这样的枚举

    public enum MenuType
       
      Category = 0,       
      Filter = 1
    

我想知道如何在类菜单中存储类别或过滤器 我的意思是 Menu 与一个 Category 或一个 Filter 相关,现在我该如何建立这种关系? 另一件事是 MenuType 可能会扩展并添加一些其他的 menutype 和那类。

【问题讨论】:

这个可以写例子吗? 有一个基类A 并让CategoryFilter 扩展它。然后在Menu 类中使用A 看看这些链接TPH 或TPT 【参考方案1】:

不可能有可以引用两个表的列外键 (FK)。

一个选项是:

  public class Category
  
    public int Id  get; set; 
    public string Name  get; set; 
    public List<Menu> Menus  get; set; 
  

  public class Filter
  
    public int Id  get; set; 
    public string Name  get; set; 
    public List<Menu> Menus  get; set; 
  

  public class Menu
  
    public int Id  get; set; 
    public string Name  get; set; 
    public MenuType MenuType  get; set; 
    public int? CategoryId  get; set; 
    public int? FilterId  get; set; 

    public Category Category  get; set; 
    public Filter Filter  get; set; 
  

在您的上下文中:

modelBuilder.Entity<Menu>().HasOne(x => x.Category).WithMany(x => x.Menus).HasForeignKey(x => x.CategoryId);
modelBuilder.Entity<Menu>().HasOne(x => x.Filter).WithMany(x => x.Menus).HasForeignKey(x => x.FilterId);

根据 MenuType,您可以使用 Category 或 Filter 对象。

【讨论】:

当然可以...继承OOP的基础。在实体框架中称为TPHTPT

以上是关于如何在 Code First c# 中将多个实体引用为一个的主要内容,如果未能解决你的问题,请参考以下文章

C# Entity Framework Code-First-如何仅使用该外键的 id 添加带有外键的行?

Code First 添加多个上下文

C# EntityFramework Code First 迁移

在Entity Framework Code First中为同一个表定义多个外键

如何在 Entity Framework Code First 中急切地包含实体的子元素和孙元素?

C#:使用实体框架代码优先访问数据库