EF 2.1 неправильно переводит Group By Query

Я пытаюсь получить рабочий запрос EF 2.1 к существующей базе данных. Я получаю сообщение об ошибке, которое говорит о том, что я неправильно настроил свои модели.

Мои модели:

public class Job
{
    public int JobId { get; set; }
    public JobStatus JobStatus { get; set; }
}

public class JobStatus
{

    [Key]
    public string JobStatusId { get; set; }

    public string Colour { get; set; }

    public ICollection<Job> Jobs { get; set; }

}

Мой запрос:

var jobs = _context.Jobs
        .GroupBy(p => p.JobStatus.Colour)
        .Select(g => new { colour = g.Key, count = g.Count() });

Ошибка: "Недопустимое имя столбца" JobStatusId ". EF преобразуется в следующий запрос:

SELECT [p.JobStatus].[Colour] AS [colour], COUNT(*) AS [count]
  FROM [Jobs] AS [p]
  LEFT JOIN [JobStatus] AS [p.JobStatus] ON [p].[JobStatusId] = [p.JobStatus].[JobStatusId]
  GROUP BY [p.JobStatus].[Colour]

Что не так. p.JobStatusId не существует, это должен быть p.JobStatus.JobStatusId. Что я делаю неправильно?

ОБНОВИТЬ

Я добавил это в свою модель работы;

public string JobStatusFK {get; set;}

И попробовал следующее:

modelBuilder.Entity<Job>().HasOne(x=>x.JobStatus).HasForeignKey(p => p.AuthorFK);

Однако Intellisense этого не позволяет:

'ReferenceNavigationBuilder<Job, JobStatus>' does not contain a definition for 'HasForeignKey' and no accessible extension method 'HasForeignKey' accepting a first argument of type 'ReferenceNavigationBuilder<Job, JobStatus>' could be found 

Можете ли вы объявить public string JobStatusId { get; set; } в классе Job

vivek nuna 11.10.2018 07:45

Но мне не нужно это поле в классе должностей ....

Robbie Mills 11.10.2018 07:55

Затем вы используете HasForeignKey в свободном API

vivek nuna 11.10.2018 07:59

вы следите за Database-First или Code-First?

er-sho 11.10.2018 08:01

Извините, я не понял, что это был FK

Robbie Mills 11.10.2018 08:08

Пожалуйста, посмотрите мое обновление

Robbie Mills 12.10.2018 04:47

@RobbieMills Я не уверен, почему public string JobStatusFK {get; set;} не работает. Но причину, по которой Intellisense не работает, можно решить с помощью этого ответа stackoverflow.com/questions/52310518/…

itminus 12.10.2018 06:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
89
2

Ответы 2

Это потому, что ваш Job : JobStatus принадлежит к Many-to-One.

EF считал, что существует внешний ключ, который ссылается на JobStatus, то есть столбец JobStatusId в Jobset как FK.

Хорошо, в этом есть смысл, как лучше всего это исправить? Это модель, которую я использую в приложении asp.net 5, которое там хорошо работает.

Robbie Mills 11.10.2018 07:55

@RobbieMills Я видел комментарии @vivek nuna. На мой взгляд, внешний ключ будет иметь смысл. Не могли бы вы рассказать нам, почему вам не нужен столбец Job.JobStatusId, но в то же время есть свойство навигации JobStatus?

itminus 11.10.2018 08:06

Ах, я не понимал, что это FK

Robbie Mills 11.10.2018 08:08

@RobbieMills - то, с чем вы столкнулись, является одной из основных причин, по которой вы никогда не должны использовать свою модель данных в своем представлении. Ваша модель данных и ваша модель представления представляют собой разные проблемы и часто требуют разных определений. Вы можете решить эту проблему, используя вашу полностью заполненную модель данных (представляющую вашу базу данных) и проецируя ее в модель представления, которая не содержит данных, которые вам не нужны.

Erik Funkenbusch 12.10.2018 04:57

Вы должны убедиться, что JobStatusId - это FK в классе Job.

Вы можете использовать приведенное ниже объявление в классе Job или использовать HasForeignKey в классе DBContext с помощью свободного API.

public string JobStatusId { get; set; }

Я пробовал это, та же ошибка, после некоторого чтения я добавил код, который я описал в своем обновлении, но все еще не могу заставить его работать

Robbie Mills 12.10.2018 04:47

Другие вопросы по теме