如何在 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
并让Category
和Filter
扩展它。然后在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
的基础。在实体框架中称为TPH
或TPT
以上是关于如何在 Code First c# 中将多个实体引用为一个的主要内容,如果未能解决你的问题,请参考以下文章
C# Entity Framework Code-First-如何仅使用该外键的 id 添加带有外键的行?
C# EntityFramework Code First 迁移
在Entity Framework Code First中为同一个表定义多个外键