В первом проекте кода (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")
, чтобы указать, какой внешний ключ принадлежит обратной связи.