Я смущен тем, как моделировать свои отношения в Entity Framework.Как получить комбинированное необязательное отношение и отношение «Один к многим»?
Я хочу, чтобы ClassA
, необязательно, указывал на ClassB
. Это похоже на необязательные отношения «один-к-одному».
Я также хочу, чтобы ClassB
всегда указывал на класс А, который указывает на него. Я также хочу разрешить нескольким ClassB
, чтобы обратиться к тем же ClassA
. Это звучит как отношения «один ко многим».
Является ли это наилучшим образом смоделированным как одно отношение, или это действительно две совершенно разные отношения?
Если это два отношения, они могут совместно использовать одно свойство ClassAKey, которое появляется в ClassB, которое будет использоваться для ссылки на ClassA
?
В моей проблеме это ясно в моей голове, что я хочу, чтобы мой О.М. быть:
ClassA
{
[Key]
int Key { get; set; }
ClassB Maybe { get; set; }
int MaybeKey { get; set; }
}
ClassB
{
[Key]
int Key { get; set; }
ClassA Always { get; set; }
int AlwaysKey { get; set; }
}
Это также ясно в моей голове, что это должно выглядеть в БД: там должно быть только ClassAKey
колонка для ClassB
и столбец ClassBKey
для ClassA
, так что каждый из них может ссылаться друг на друга и отношения внешних ключей на этих столбцах.
Но ... Я не понимаю, как можно моделировать это в EF. На самом деле кажется, что я должен что-то делать неправильно! Если я только начинаю с кода выше, я получаю сообщение об ошибке.
Unable to determine the principal end of an association between the types 'ClassA' and 'ClassB'. The principal end of this association must be explicitly configured using either the relationship fluent API or data annotations.
Если я пытаюсь настроить его так,
modelBuilder.Entity<ClassA>()
.HasOptional(a => a.Maybe)
.WithRequired(b => b.Always);
я по какой-то причине получить то, что выглядит неправильно дизайнер код, сгенерированный где ClassB имеет неправильное внешнего ключ свойство
.ForeignKey("dbo.ClassAs", t => t.Key)
Это должно быть t.AlwaysKey, правильно? Что происходит !?
Не уверен, что я понял, но что вы получите, если попытаетесь создать .edmx из существующего db? –