В первом проекте кода (EF5, MVC4) у меня есть объект, называемый Consult. Он содержит набор заметок, которые сохраняются и извлекаются правильно в собственной таблице.Код EF5 во-первых: база данных ok, неправильные запросы
Объект Consult может использоваться для сбора других объектов Consult для обратной связи (функциональные требования приложения). Таким образом, у Consult есть свойство Feedback Feedback, которое представляет собой список объектов FeedbackRelation, представляющих выбранные объекты Consult. Эта информация сохраняется в таблице FeedbackRelation, где каждая запись содержит идентификатор консультанта, который содержит коллекцию, и идентификатор консультанта, который является частью коллекции (и некоторые простые служебные свойства).
Обратиться к сущности определяется как:
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, струнные) свойства были опущены для ясности.
Создание консультанта и добавление других компонентов Consult в список отзывов работает. Все данные правильно сохранены в базе данных.
Получение справки не возвращает Обратная связь. Feedback.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")
, чтобы указать, какой внешний ключ принадлежит обратным связям.
я прав, если я описываю свои изменения, как: - переименовать свойство навигации 'Feedbacks' в' ChildFeedbacks'; - добавить свойство навигации ParentFeedbacks с атрибутом inverse property 'Consult' (я не добавил этого, потому что думал, что мне это не нужно). Таким образом, свойство навигации 'ChildFeedbacks' все еще имеет' Обратная связь' в качестве своего обратного свойства? Я пробовал это, безуспешно. –
Я не уверен, что вы экспонируете, чтобы видеть и чего вы не видите. Я также не понимаю отношения, которые вы пытаетесь моделировать. Вы хотите что-то вроде этого: http://stackoverflow.com/q/12252868/150342 – Colin
Да, это он более или менее. Я просто хочу, чтобы у отношения было какое-то свойство, поэтому я определил, что сам вместо того, чтобы оставить его до EF. Странно, что созданная база данных точно выглядит так, как я ожидал, создание и сохранение объектов работает должным образом. Это просто получение отношения, которое не работает. –