2013-12-11 2 views
0

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

ответ

0

Вы указали, что Feedbacks навигационного свойство имеет в FeedbackRelation в InverseProperty имени 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; } 
} 
+0

я прав, если я описываю свои изменения, как: - переименовать свойство навигации 'Feedbacks' в' ChildFeedbacks'; - добавить свойство навигации ParentFeedbacks с атрибутом inverse property 'Consult' (я не добавил этого, потому что думал, что мне это не нужно). Таким образом, свойство навигации 'ChildFeedbacks' все еще имеет' Обратная связь' в качестве своего обратного свойства? Я пробовал это, безуспешно. –

+0

Я не уверен, что вы экспонируете, чтобы видеть и чего вы не видите. Я также не понимаю отношения, которые вы пытаетесь моделировать. Вы хотите что-то вроде этого: http://stackoverflow.com/q/12252868/150342 – Colin

+0

Да, это он более или менее. Я просто хочу, чтобы у отношения было какое-то свойство, поэтому я определил, что сам вместо того, чтобы оставить его до EF. Странно, что созданная база данных точно выглядит так, как я ожидал, создание и сохранение объектов работает должным образом. Это просто получение отношения, которое не работает. –

Смежные вопросы