2013-02-20 2 views
0

У меня есть следующие классы моделиКак предотвратить создание EntityFramework из нескольких отношений внешнего ключа?

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 конвенции должна генерировать таблицу

MenuItem

С MenuItemId как первичный ключ и MenuId в качестве ключа Foregin, но из-за чего-то EF продолжает генерировать повторяющиеся внешние ключи (дополнительно 4, если быть точным) для MenuId нравится MenuId1,2,3,4.

Это потому, что у меня есть ICollection MenuItems?

Я не понимаю, почему это должно быть проблемой.

ответ

1

Ваша текущая настройка создаст четыре разных отношения к таблице MenuItem. Как насчет смены модели так, чтобы у Menu была одна коллекция ICollection<MenuItem> MenuItems. Это будет содержать все MenuItem s, для всех MenuType s.

Вы можете создать свойства BreakfastMenuItems, LunchMenuItems и т.д., фильтрация MenuItems на основе MenuType собственности. Или, альтернативно, создайте функцию Menu.GetMenuItemsByType(MenuType menuType), которая вернет результаты, которые вы хотите.

+0

Обязательно дайте ему возможность! .. но все равно я могу переопределить это поведение. Я пробовал явное связывание FK с использованием как аннотаций данных, так и API EF Fluent, но не повезло –

0

Да, это происходит из-за коллекций в вашем классе меню. Из вашей модели EF следует, что один пункт меню может принадлежать спискам BreakFast, Lunch, Snacks, Dinner в меню. Любой пункт меню может быть во всех/some/none из них. Так что это самый простой дизайн, который он создает.

Однако, код кода сначала кодируется первым. Когда вы выберете свою модель, вы всегда можете внести небольшие изменения.

Смежные вопросы