В проект с първи код (EF5, MVC4) имам обект, наречен Consult. Има колекция от бележки, които се записват и извличат правилно в собствената му таблица.
Субект Consult може да се използва за събиране на други обекти Consult за обратна връзка (функционално изискване на приложението). Така Consult има свойство за навигация Feedbacks, което е списък от обекти FeedbackRelation, представляващи избраните обекти Consult. Тази информация се записва в таблица FeedbackRelation, където всеки запис съдържа ИД на Консулт, който съдържа колекцията, и ИД на Консулт, който е част от колекцията (и някои прости свойства за поддържане).
Субектът 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) са пропуснати за по-голяма яснота.
Създаването на консултация и добавянето на други обекти на консултация към списъка с обратна връзка работи. Всички данни са правилно записани в базата данни.
Извличането на консултацията не извлича обратната връзка. Броят на обратната връзка винаги е нула.
Проверих 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")
, за да посоча кой външен ключ принадлежи към обратната връзка.