У меня довольно простая настройка Web API 2.2 (EF6), где у меня есть пользователи и настройки. У пользователей может быть много настроек, а в настройках может быть много пользователей, поэтому у меня есть таблица соединений UserPreferences. Вот эти таблицы:Entity Framework: многие-ко-многим с пользовательской таблицей соединений?
CREATE TABLE [dbo].[Users](
[Id] [int] IDENTITY(1,1) NOT NULL,
[FirstName] [varchar](50) NULL,
[LastName] [varchar](50) NULL,
[Email] [varchar](50) NULL)
CREATE TABLE [dbo].[Preferences](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NULL,
[PossibleValues] [nvarchar](250) NULL)
CREATE TABLE [dbo].[UserPreferences](
[Id] [int] IDENTITY(1,1) NOT NULL,
[PreferenceId] [int] NOT NULL,
[UserId] [int] NOT NULL,
[Value] [nvarchar](50) NULL)
Как вы можете видеть, предпочтение имеет список возможных значений (разделенные запятые), и UserPreference имеет значение, которое должно быть то, что пользователь выбрал в качестве выбранной величины , Так, например, если Возможные значения предпочтительности: «Синий, Зеленый, Красный, Белый», значение UserPreference может быть «Синим». По-моему, этот тип отношений много-ко-многим, но поскольку я добавил еще одно поле в таблицу соединений (Value), Entity Framework не может справиться с этим как много-ко-многим. According to this question's answer, мне нужно создать два отношения «один ко многим» для этого. Таким образом, я последовал совету этого поста:
public partial class User
{
public User()
{
Preferences = new HashSet<UserPreference>();
}
public int Id { get; set; }
[Required]
public string FirstName { get; set; }
[Required]
public string LastName { get; set; }
[Required]
public string Email { get; set; }
public virtual ICollection<UserPreference> Preferences { get; set; }
}
public partial class Preference
{
public Preference()
{
Users = new HashSet<UserPreference>();
}
public int Id { get; set; }
[Required]
public string Name { get; set; }
[Required]
public string PossibleValues { get; set; }
public virtual ICollection<UserPreference> Users { get; set; }
}
public partial class UserPreference
{
public int Id { get; set; }
[Key,Column(Order = 0)]
public int UserId { get; set; }
[Key, Column(Order = 1)]
public int PreferenceId { get; set; }
public virtual User User { get; set; }
public virtual Preference Preference { get; set; }
public string Value { get; set; }
}
Я думаю, что выглядит правильно, но когда я запрашиваю службы с помощью метода контроллера, как это в моем UsersController:
// GET: odata/Users(5)/Preferences
[EnableQuery]
public IQueryable<UserPreference> GetPreferences([FromODataUri] int key)
{
return _db.Users.Where(m => m.Id == key).SelectMany(m => m.Preferences);
}
я получаю исключение «Недопустимое имя объекта:« dbo.UserPreferences ».»
"message": "Invalid object name 'dbo.UserPreferences'.",
"type": "System.Data.SqlClient.SqlException",
Я четко иметь НайтиСтраницу таблицы, поэтому я могу только предположить, что это не выглядит как EF ожидает, что это, но я понятия не имею, что я должен делать, чтобы получить эту работу. Мне не нужно получать список пользователей для предпочтения, но мне нужно получить список настроек для пользователя, и я просто не могу заставить это работать.
ли таблица была создана в базе данных? Используете ли вы первую миграцию кода? – jjj
Попробуйте явно отобразить класс 'UserPreference' в таблицу' UserPreferences', возможно, алгоритм множественности имеет сбой. –
Нет, я не использую первые миграции кода. Я уже создал таблицы. Единственное, что я создаю с помощью EF, - это контроллеры Web API. – Eddie