Я абсолютно озадачен, пытаясь понять, как реализовать двунаправленную связь 1..n в Entity Framework с использованием Code First. Например, у команды (представленной сущностью Team) есть тренер и менеджер (оба представлены сущностью Person). Итак, моя модель команды может быть следующей:
public class Team
{
public Team()
{
Manager = new Person();
Coach = new Person();
}
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int TeamID { get; set; }
public string Name { get; set; }
[ForeignKey("Manager")]
public int ManagerID { get; set; }
public virtual Person Manager { get; set; }
[ForeignKey("Coach")]
public int CoachID { get; set; }
public virtual Person Coach { get; set; }
}
Я могу реализовать одностороннюю навигацию, реализовав объект Person следующим образом:
public class Person
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int PersonID { get; set; }
public string Name { get; set; }
}
и свободный API:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Team>()
.HasRequired(t => t.Manager);
modelBuilder.Entity<Team>()
.HasRequired(t => t.Coach);
base.OnModelCreating(modelBuilder);
}
Однако, хотя это позволяет мне переходить от объекта «Команда» к соответствующему Coach и Manager (оба экземпляра Person), это не позволяет мне напрямую переходить от Coach или Manager к соответствующей команде. Итак, чтобы реализовать двустороннюю навигацию, я изменил сущность Person следующим образом:
public class Person
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int PersonID { get; set; }
public string Name { get; set; }
[ForeignKey("Team")]
public int TeamID { get; set; }
public virtual Team Team { get; set; }
}
Пока все идет нормально, я получаю следующую ошибку времени выполнения, когда пытаюсь сохранить в базе данных:
System.Data.Entity.Core.UpdateException
InnerException: Unable to determine a valid ordering for dependent operations. Dependencies may exist due to foreign key constraints, model requirements, or store-generated values.
Итак, чтобы указать порядок между объектами, я попытался изменить свободный API, добавив «WithRequiredPricipal» следующим образом:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Team>()
.HasRequired(t => t.Manager)
.WithRequiredPrincipal(t => t.Team);
modelBuilder.Entity<Team>()
.HasRequired(t => t.Coach)
.WithRequiredPrincipal(t => t.Team);
base.OnModelCreating(modelBuilder);
}
Однако, когда я пытаюсь выполнить «надстройку-миграцию» в консоли диспетчера пакетов, я получаю следующую ошибку:
System.InvalidOperationException: The navigation property 'Team' declared on type 'RelatedEntities.Models.Person' has been configured with conflicting foreign keys.
То, что я пытаюсь достичь, кажется простым требованием, но я много раз искал решение, но пока не нашел ответа. Мне что-то не хватает в текучем API или аннотациях?
(Я не хочу использовать обходной путь, например, реализацию отдельных моделей для тренера и менеджера, потому что у команды может быть множество других ролей (например, помощник тренера, менеджер по связям с общественностью и т. Д.). Я бы хотел, чтобы каждая была просто экземпляром сущности Person.)