#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 не поддерживает свойства навигации для сложных типов, которые конкурирующие фреймворки поддерживали с незапамятных времен. Хотел бы я сказать, что я удивлен…