Если у вас нет кода Fluent API, ожидаемое сопоставление зависит от соглашений EF Code First.Соглашение, которое вы ожидаете здесь заключить, это AssociationInverseDiscoveryConvention
.Теперь, если вы посмотрите в Intellisense (и, вероятно, также в документации), он говорит об этом соглашении:
Соглашение по обнаружению навигационных свойств, которые должны быть противоположны друг другу , когда существует только одна пара навигационных свойств междусвязанные типы .
Теперь вот в чем проблема: у вас нет только «одной пары» навигационных свойств между Questionnaire
и Vendor
.У вас есть две коллекции в Vendor
, ссылающиеся на Questionnaire
, и одна коллекция в Questionnaire
, ссылающиеся на Vendor
.В результате это соглашение не применяется, и EF отображает на самом деле три взаимосвязи один-ко-многим только с одним концом, отображаемым в качестве свойства навигации в модели.
Кроме того, вы отображаетежелать достичь невозможно с вашей моделью: вы не можете отобразить один конец Questionnaire.Vendors
на два конца Vendor.OpenQuestionnaires
и Vendor.SubmittedQuestionnaires
.
OneОбходной путь - изменить модель следующим образом:
public class Vendor
{
public int VendorID { get; set; }
public string VendorName { get; set; }
[NotMapped]
public IEnumerable<Questionnaire> OpenQuestionnaires
{
get { return Questionnaires.Where(q => q.IsActive); }
}
[NotMapped]
public IEnumerable<Questionnaire> SubmittedQuestionnaires
{
get { return Questionnaires.Where(q => !q.IsActive); }
}
public virtual ICollection<Questionnaire> Questionnaires { get; set; }
public virtual ICollection<QuestionnaireUser> QuestionnaireUsers { get; set; }
}
Теперь Vendor.Questionnaires
сопоставлен с Questionnaire.Vendors
(AssociationInverseDiscoveryConvention
должен это определить), а вспомогательные свойства OpenQuestionnaires
и SubmittedQuestionnaires
позволяют вамвытащить выбранные предметы.(Я не уверен, является ли IsActive
вашим отличительным флагом. В противном случае вам нужно ввести какой-то новый флаг.)
Атрибут [NotMapped]
здесь только для того, чтобы сделать его явным.Вероятно, в этом нет необходимости, потому что EF не будет отображать коллекции IEnumerable
и свойства только для чтения в любом случае только с геттером.