Вопрос о сопоставлении EF

#entity-framework #mapping #ef-code-first

#entity-framework #сопоставление #ef-code-first

Вопрос:

Допустим, у меня есть следующие классы:

 public class User
{
    public int UserId { get;set;}
    public string Firstname { get;set;}
    public Interests Interests { get;set;}
}
public class Interests
{
    public IList<Team> FavoriteTeams { get;set;}
    public IList<Food> FavoriteFoods { get;set;}
}
public class Team{
    public int TeamId { get;set;}
    public string City {get;set;}
    public string Name { get;;set;}
}
public class Food{
    public int FoodId { get;set;}
    public string FoodName { get;set;}
}
  

На уровне базы данных я хотел бы иметь следующие таблицы:

Пользователи, команды, продукты, пользовательские группы, пользовательские продукты

В принципе, я хотел бы иметь свойство Interests объекта user, но не иметь для него отдельной таблицы.

Я использую код EF 4.1 для первых классов POCO. Я знаю, что проще всего сделать, это передать команды и коллекцию продуктов питания в качестве свойства пользователю, что нормально, но с точки зрения объектной модели я бы хотел, чтобы это было его собственным свойством. Есть идеи о том, как я мог бы достичь такого типа сопоставления?

Ответ №1:

Я бы сказал: сопоставление, которое вы ищете, невозможно, потому что:

Если вы не хотите, чтобы класс Interests отображался в таблицу, он не должен быть сущностью, а Interests свойство в вашем User классе не должно быть свойством навигации. Чтобы избежать того, что EF интерпретирует Interests свойство как свойство навигации, у вас будет только два варианта:

  • Пометьте это как NotMapped -> Не помогает, потому что вы потеряете связь от User до Team и Food полностью
  • Пометьте Interests класс как ComplexType -> Невозможно в вашем примере, потому что сложным типам не разрешается содержать свойства навигации.

Это только с моего уровня понимания. Не исключено, что я упустил из виду другой вариант.

Комментарии:

1. Очень жаль, что EF не поддерживает свойства навигации для сложных типов, которые конкурирующие фреймворки поддерживали с незапамятных времен. Хотел бы я сказать, что я удивлен…