Сначала код EF5: база данных в порядке, запросы неверны

В первом проекте кода (EF5, MVC4) у меня есть объект с именем Consult. Он имеет набор заметок, которые сохраняются и корректно извлекаются в его собственной таблице.

Сущность Consult может использоваться для сбора отзывов о других сущностях Consult (функциональное требование приложения). Таким образом, у Consult есть свойство навигации Feedbacks, которое представляет собой список сущностей FeedbackRelation, представляющих выбранные сущности Consult. Эта информация сохраняется в таблице FeedbackRelation, где каждая запись содержит идентификатор Consult, который содержит коллекцию, и ID Consult, который является частью коллекции (и некоторые простые служебные свойства).

Сущность Consult определяется как:

public class Consult
{
    public virtual Guid ID { get; set; }
    public virtual string Subject { get; set; }

    public virtual ICollection<Note> Notes { get; set; }

    [InverseProperty("Feedback")]
    public virtual ICollection<FeedbackRelation> Feedbacks { get; set; }
}

А сущность FeedbackRelation выглядит так:

public class FeedbackRelation
{
    public Guid ID { get; set; }
    [Required]
    public virtual Guid FeedbackID { get; set; }
    [Required]
    public virtual Guid ConsultID { get; set; }

    [ForeignKey("FeedbackID")]
    public virtual Consult Feedback { get; set; }

    [ForeignKey("ConsultID")]
    public virtual Consult Consult { get; set; }
}

Некоторые простые свойства (bool, string) опущены для ясности.

Создание Consult и добавление других объектов Consult в список Feedbacks работает. Все данные корректно сохраняются в базе данных.

Получение консультации не приводит к получению отзывов. Feedbacks.Count всегда равен нулю.

Я изучил SQL, отправленный на сервер, при получении отзывов. Это выглядит так:

exec sp_executesql N'SELECT 
[Extent1].[ID] AS [ID], 
[Extent1].[FeedbackID] AS [FeedbackID], 
[Extent1].[ConsultID] AS [ConsultID], 
FROM [dbo].[FeedbackRelation] AS [Extent1]
WHERE [Extent1].[FeedbackID] = @EntityKeyValue1',N'@EntityKeyValue1 uniqueidentifier',@EntityKeyValue1='58429806-CE36-4FDE-AD79-07E0872E3735'

В более читаемом виде это:

select * from FeedbackRelation where FeedbackID = '58429806-CE36-4FDE-AD79-07E0872E3735'

Однако это должно быть:

select * from FeedbackRelation where ConsultID = '58429806-CE36-4FDE-AD79-07E0872E3735'

Выполнение этого запроса к базе данных возвращает ожидаемый результат.

Почему EF использует идентификатор родительской записи в качестве аргумента поиска для дочернего идентификатора? Я дал атрибут InverseProperty("Feedback"), чтобы указать, какой внешний ключ принадлежит обратной связи.


person Ge We    schedule 11.12.2013    source источник


Ответы (1)


Вы указали, что свойство навигации Feedbacks имеет InverseProperty в FeedbackRelation с именем Feedback, и вы указали, что свойство Feedback имеет внешний ключ с именем FeedbackID. Это означает, что когда вы хотите получить Feedbacks, он должен получить их, используя FeedbackID. Поэтому я не понимаю, почему вы ожидаете, что вместо этого будет использоваться ConsultID.

Кажется, вам не хватает второго навигационного свойства в классе Consult, и я нахожу это название запутанным. Я бы ожидал что-то вроде этого:

public class Consult
{
    public virtual Guid ID { get; set; }

    //etc

    [InverseProperty("Feedback")]
    public virtual ICollection<FeedbackRelation> ChildFeedbacks { get; set; }

    [InverseProperty("Consult")]
    public virtual ICollection<FeedbackRelation> ParentFeedbacks { get; set; }
}
person Colin    schedule 11.12.2013
comment
Правильно ли я понимаю ваши изменения: - переименовать навигационное свойство Feedbacks в ChildFeedbacks; - добавить свойство навигации ParentFeedbacks с обратным атрибутом свойства Consult (я не добавлял его, потому что думал, что он мне не нужен). Итак, свойство навигации ChildFeedbacks по-прежнему имеет Feedback в качестве обратного свойства? Я пробовал это, но безуспешно. - person Ge We; 12.12.2013
comment
Я не уверен, что вы ожидаете увидеть и что вы не видите. Я также не понимаю отношения, которые вы пытаетесь моделировать. Вы хотите что-то вроде этого: stackoverflow.com/q/12252868/150342 - person Colin; 13.12.2013
comment
Да, это более-менее. Я просто хочу, чтобы само отношение имело некоторые свойства, поэтому я определил это сам, а не оставил это на усмотрение EF. Странно то, что сгенерированная база данных выглядит именно так, как я ожидал, создание и сохранение объектов работает так, как ожидалось. Это просто получение отношения, которое не работает. - person Ge We; 13.12.2013