Основной конец этой ассоциации должен быть явно сконфигурирован с использованием либо свободного API API, либо аннотаций данных - программирование
Подтвердить что ты не робот

Основной конец этой ассоциации должен быть явно сконфигурирован с использованием либо свободного API API, либо аннотаций данных

"Основной конец этой ассоциации должен быть явно сконфигурирован с использованием либо свободного API API, либо аннотаций данных".

Я получаю эту ошибку в Entity Framework 4.4 при обновлении/миграции базы данных, но я не пытаюсь указать отношения 1:1. Я хочу что-то вроде этого:

public class EntityA
{
    public int ID { get; set; }
    public int EntityBID { get; set; }

    [ForeignKey("EntityBID")]
    public virtual EntityB EntityB { get; set; }
}

public class EntityB
{
    public int ID { get; set; }
    public Nullable<int> PreferredEntityAID { get; set; }

    [ForeignKey("PreferredEntityAID")]
    public virtual EntityA PreferredEntityA { get; set; }
}

где EntityA должен иметь родительский EntityB, тогда как EntityB может иметь предпочтительный дочерний EntityA, но не обязательно. Предпочтительным ребенком должен быть один из детей, связанный с родителем, но я не знаю, как обеспечить его выполнение в базе данных. Я планирую обеспечить ее программную реализацию.

Как мне обойти эту ошибку или лучший способ выполнить эти отношения?

4b9b3361

Ответ 1

Entity Framework Code-First соглашения предполагают, что EntityA.EntityB и EntityB.PreferredEntityA относятся к одному и тому же отношению и являются свойствами обратной навигации друг друга. Поскольку оба свойства навигации являются ссылками (а не коллекциями), EF передает отношения "один к одному".

Поскольку вы действительно хотите два отношения "один ко многим", вы должны переопределить соглашения. С вашей моделью это возможно только с Fluent API:

modelBuilder.Entity<EntityA>()
    .HasRequired(a => a.EntityB)
    .WithMany()
    .HasForeignKey(a => a.EntityBID);

modelBuilder.Entity<EntityB>()
    .HasOptional(b => b.PreferredEntityA)
    .WithMany()
    .HasForeignKey(b => b.PreferredEntityAID);

(Если вы используете это, вы можете удалить атрибуты [ForeignKey].)

Вы не можете указать сопоставление, которое гарантирует, что предпочтительный ребенок всегда является одним из связанных дочерних элементов.

Если вы не хотите использовать Fluent API, но только аннотации данных, вы можете добавить свойство коллекции в EntityB и связать его с EntityA.EntityB с помощью атрибута [InverseProperty]:

public class EntityB
{
    public int ID { get; set; }
    public Nullable<int> PreferredEntityAID { get; set; }

    [ForeignKey("PreferredEntityAID")]
    public virtual EntityA PreferredEntityA { get; set; }

    [InverseProperty("EntityB")] // <- Navigation property name in EntityA
    public virtual ICollection<EntityA> EntityAs { get; set; }
}