EF Core многие ко многим не сохраняются в таблице соединений - PullRequest
0 голосов
/ 18 июня 2020

У меня есть следующие классы

public class Travel
{
    public int Id { get; set; }
    public string Location { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
    public List<Activity> Activities { get; set; }
    public List<ActivityTravel> ActivitityTravels { get; set; } = new List<ActivityTravel>();
}

public class Activity
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<ActivityTravel> ActivitityTravels { get; set; } = new List<ActivityTravel>();
}

public class ActivityTravel
{
    public int TravelId { get; set; }
    public Travel Travel { get; set; }
    public int ActivityId { get; set; }
    public Activity Activity { get; set; }
}

My ApplicationDbContext выглядит так

modelBuilder.Entity<ActivityTravel>()
        .HasKey(at => new { at.ActivityId, at.TravelId });

        modelBuilder.Entity<ActivityTravel>()
        .HasOne(at => at.Activity)
        .WithMany(a => a.ActivitityTravels)
        .HasForeignKey(at => at.ActivityId);

        modelBuilder.Entity<ActivityTravel>()
        .HasOne(at => at.Travel)
        .WithMany(t => t.ActivitityTravels)
        .HasForeignKey(at => at.TravelId);

    //outside of OnModelCreating
    public DbSet<Travel> Travels { get; set; }
    public DbSet<Activity> Activities { get; set; }
    public DbSet<ActivityTravel> ActivityTravels { get; set; }

Пользователь может добавить новый Travel с количеством уже существующих Активов . Но каждый раз, когда в контекст добавляется новое Путешествие, к ActivityTravel ничего не добавляется. Вот код, используемый для добавления нового Travel

    public async Task<ActionResult> AddTravel([FromBody] Travel travel)
    {   
        travel.Activities.ForEach(a => travel.ActivitityTravels.Add(new ActivityTravel() { Activity = a, Travel = travel }));
        _context.Travels.Add(travel);

        //dont add activity again
        travel.Activities.ForEach(a => _context.Entry(a).State = EntityState.Detached);
        _context.SaveChanges();

        return Ok();
    }

Я следил за примером в этом вопросе Сохранение отношения «многие ко многим» в Entity Framework Core

1 Ответ

1 голос
/ 18 июня 2020

Вы не должны отсоединять существующие Activities, вам нужно прикрепить их перед обработкой других вещей, чтобы они не были добавлены как дубликаты. Примерно так:

public async Task<ActionResult> AddTravel([FromBody] Travel travel)
{   
    travel.Activities.ForEach(a => travel.ActivitityTravels.Add(new ActivityTravel() { Activity = a, Travel = travel }));
    _context.AttachRange(travel.Activities);
    _context.Travels.Add(travel);
    _context.SaveChanges();
    return Ok();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...