如何防止EntityFramework生成多个外键关系

本文关键字:关系 何防止 EntityFramework | 更新日期: 2023-09-27 18:00:19

我有以下模型类

public class MenuItem
{
    public int MenuItemId { get; set; }
    public int MenuId { get; set; }
    public Menu Menu { get; set; }
    public string Name { get; set; }
    public int Price { get; set; }
    public MenuType MenuType { get; set; }
}
public class Menu 
{
    public int MenuId { get; set; }
    public DateTime Date { get; set; }
    public ICollection<MenuItem> BreakFast { get; set; }
    public ICollection<MenuItem> Lunch { get; set; }
    public ICollection<MenuItem> Snacks { get; set; }
    public ICollection<MenuItem> Dinner { get; set; }
}

现在我的理解是,根据EF Code First约定,它应该生成表

菜单项

MenuItemId作为主键,将MenuIdenuId成重复的外键(确切地说是额外的4个),如MenuId1,2,3,4。

是因为我有MenuItems的ICollection吗?

我不明白为什么这会成为一个问题。

如何防止EntityFramework生成多个外键关系

您当前的设置将创建与MenuItem表的四种不同关系。改变你的型号,使Menu有一个ICollection<MenuItem> MenuItems的集合怎么样。这将包含所有MenuItem s,对于所有MenuType s。

然后,您可以为BreakfastMenuItemsLunchMenuItems等创建属性,根据MenuType属性对MenuItems进行筛选。或者,创建一个函数Menu.GetMenuItemsByType(MenuType menuType),返回所需的结果。

是的,这是因为菜单类中的集合。根据您的模型EF推断,一个菜单项可以属于菜单中的BreakFast、Lunch、Snacks、Dinner列表。任何菜单项都可以在全部/部分/无菜单项中。因此,这是它生成的最直接的设计。

然而,编码优先的意义在于…编码优先。一旦你弄清楚了你的模型,那么你总是可以做一些小的改变。