эф ядро ​​- отношения многие ко многим - PullRequest
1 голос
/ 01 мая 2020

Я пытался использовать ef core недавно, но есть кое-что, что ставит в тупик отношения многих ко многим в ef core.

    public class Location
{
    public Guid Id { get; set; }
    public ICollection<LocationInstructor> LocationInstructors { get; set; } = new List<LocationInstructor>();
}

public class Instructor
{
    public Guid Id { get; set; }
    public ICollection<LocationInstructor> LocationInstructors { get; set; } = new List<LocationInstructor>();
}

public class LocationInstructor
{
    public Guid LocationId { get; set; }
    public Location Location { get; set; }
    public Guid InstructorId { get; set; }
    public Instructor Instructor { get; set; }
}

и в dbcontext

protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<LocationInstructor>()
            .HasKey(bc => new { bc.LocationId, bc.InstructorId });
        modelBuilder.Entity<LocationInstructor>()
            .HasOne(bc => bc.Location)
            .WithMany(b => b.LocationInstructors)
            .HasForeignKey(bc => bc.InstructorId);
        modelBuilder.Entity<LocationInstructor>()
            .HasOne(bc => bc.Instructor)
            .WithMany(c => c.LocationInstructors)
            .HasForeignKey(bc => bc.LocationId);
    }

это операция, которую я пытаюсь выполнить

var instructors = new List<Instructor>
        {
            new Instructor(),new Instructor()
        };
        await applicationDbContext.Instructors.AddRangeAsync(instructors);


        Location location = new Location();

        foreach (var instructor in instructors)
        {
            location.LocationInstructors.Add(new LocationInstructor { Instructor= instructor, Location=location});
        }

        await applicationDbContext.Locations.AddAsync(location);
        await applicationDbContext.SaveChangesAsync();

, когда я запускаю эту операцию, я вижу, что ниже скриншоты enter image description here

Итак, мой вопрос почему значение 2 отличается? Я что-то здесь упускаю?

1 Ответ

1 голос
/ 01 мая 2020

Вы перепутали отображения отношений, в основном связывая InstructorId с Location и LocationId с Instructor:

modelBuilder.Entity<LocationInstructor>()
    .HasOne(bc => bc.Location) // (1)
    .WithMany(b => b.LocationInstructors)
    .HasForeignKey(bc => bc.InstructorId); // (1)

modelBuilder.Entity<LocationInstructor>()
    .HasOne(bc => bc.Instructor) // (2)
    .WithMany(c => c.LocationInstructors)
    .HasForeignKey(bc => bc.LocationId); // (2)

Конечно, они должны быть спарены (LocationId, Location) и (InstructorId, Instructor)

modelBuilder.Entity<LocationInstructor>()
    .HasOne(bc => bc.Location) // (1)
    .WithMany(b => b.LocationInstructors)
    .HasForeignKey(bc => bc.LocationId); // (1)

modelBuilder.Entity<LocationInstructor>()
    .HasOne(bc => bc.Instructor) // (2)
    .WithMany(c => c.LocationInstructors)
    .HasForeignKey(bc => bc.InstructorId); // (2)

, которые, кстати, являются стандартным отображением по умолчанию, поэтому их можно пропустить (соглашение по конфигурации).

...