1

У меня довольно простая настройка 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 ожидает, что это, но я понятия не имею, что я должен делать, чтобы получить эту работу. Мне не нужно получать список пользователей для предпочтения, но мне нужно получить список настроек для пользователя, и я просто не могу заставить это работать.

+0

ли таблица была создана в базе данных? Используете ли вы первую миграцию кода? – jjj

+0

Попробуйте явно отобразить класс 'UserPreference' в таблицу' UserPreferences', возможно, алгоритм множественности имеет сбой. –

+0

Нет, я не использую первые миграции кода. Я уже создал таблицы. Единственное, что я создаю с помощью EF, - это контроллеры Web API. – Eddie

ответ

0

Удалить

public int Id { get; set; }

из класса UserPreference.

Мой код:

public class AgreementCourse 
{ 
    [Key, Column(Order = 0)] 
    [ForeignKey("Agreement")] 
    public int AgreementId { get; set; } 
    public virtual Agreement Agreement { get; set; } 

    [Key, Column(Order = 1)] 
    [ForeignKey("Course")] 
    public int CourseId { get; set; } 
    public virtual Course Course { get; set; } 

    public CourseTypeEnum CourseType { get; set; } 
} 
Смежные вопросы