Сохранение отношений многие-многие Entity Framework Core 2.2 - PullRequest
0 голосов
/ 20 октября 2019

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

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

public class Assessor : IEntity
{
    public int Id { get; set; }
    public int RegionId { get; set; }
    public string Initials { get; set; }
    public string Name { get; set; }
    public string Surname { get; set; }

    public virtual Region Region { get; set; }
    public virtual ICollection<AssessorProductRange> ProductRange {get;set;}
    public virtual ICollection<AssessorAreaRange> AreaRange { get; set; }
}

public class Product : IEntity
{
    public int Id { get; set; }
    public string ProductName { get; set; }
    public string ProductType { get; set; }
    public int CreatedBy { get; set; }
    public DateTime CreatedDate { get; set; }
    public int? UpdatedBy { get; set; }
    public DateTime? UpdatedDate { get; set; }
    public bool IsArchived { get; set; }

    [IgnoreDataMember]
    public virtual ICollection<AssessorProductRange> AssessorProductRange { get; set; }
}

public class AssessorProductRange
{
    public int? AssessorId { get; set; }
    public Assessor Assessor { get; set; }
    public int? ProductId { get; set; }
    public Product Product { get; set; }
}

У меня также есть следующая конфигурация (много ко многим)

public class AssessorProductRangeConfiguration : IEntityTypeConfiguration<AssessorProductRange>
{
    public void Configure(EntityTypeBuilder<AssessorProductRange> builder)
    {
        builder.HasKey(k => new { k.AssessorId, k.ProductId });

        builder.HasOne(o => o.Assessor)
            .WithMany(m => m.ProductRange)
            .HasForeignKey(f => f.AssessorId)
            .OnDelete(DeleteBehavior.Cascade);

        builder.HasOne(o => o.Product)
            .WithMany(m => m.AssessorProductRange)
            .HasForeignKey(f => f.ProductId)
            .OnDelete(DeleteBehavior.Restrict);
    }
}

Класс Assessorсодержит некоторую информацию об оценщике. Класс Product содержит некоторую информацию о продукте / услуге, доступной в системе. AssessorProductRange представляет собой объединяющую таблицу между Assessor и Product.

У меня есть раздел на моем веб-сайте, где вы можете добавлять / редактировать оценщика, а также добавлять / удалять продукты, которые этот оценщикпредложения. Вот скриншот для справки.

enter image description here

Когда я добавляю оценщика, связь между Assessor и Product работает как положено, исоответствующие данные сохраняются в каждой отдельной таблице, как и ожидалось.

Когда я редактирую Ассессор, скажем, я снимаю (снимите флажок) флажок и сохраняю оценщик, не отмеченный продукт не удаляется из таблицы AssessorProductRange. Обратите внимание, что все свойства самого Assessor объекта, например инициалы и т. Д., Обновляются корректно.

Вот мой метод Update с соответствующими функциями.

Я не могу всю жизньиз меня понять, почему? Любая помощь будет оценена.

public async Task<bool> UpdateAssessorAsync(Assessor assessor)
    {
        try
        {
            //this._repo.AttachEntity<Assessor>(assessor);
            this._repo.ModifyState<Assessor>(assessor, Microsoft.EntityFrameworkCore.EntityState.Modified);
            this._repo.ModifyState<AssessorAreaRange>(assessor.AreaRange, Microsoft.EntityFrameworkCore.EntityState.Modified);
            this._repo.ModifyState<AssessorProductRange>(assessor.ProductRange, Microsoft.EntityFrameworkCore.EntityState.Modified);
            return await this._repo.SaveAsync() > 0 ? true : false;
        }
        catch (Exception)
        {
            //log
            throw;
        }
    }

public void ModifyState<TEntity>(TEntity entity, EntityState state) where TEntity : class, IEntity
    {
        Context.Entry(entity).State = state;
    }

    public void ModifyState<TEntity>(ICollection<TEntity> entities, EntityState state) where TEntity : class
    {
        foreach (TEntity entity in entities)
            Context.Entry(entity).State = state;
    }

1 Ответ

0 голосов
/ 21 октября 2019

Вам необходимо удалить существующую запись в AssessorProductRange с текущим AssessorId и обновление с новыми данными:

var list = _context.AssessorProductRange.Where(s => s.AssessorId == Assessor.Id).ToList();
_context.AssessorProductRange.RemoveRange(list);
_context.Update(accessor);
await _context.SaveChangesAsync();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...