Я знаю, что этот вопрос задавался несколько раз, простой поиск по названию этого поста докажет это, но я не могу найти решение своей проблемы. Вот оно:
У меня есть следующие классы:
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
.
У меня есть раздел на моем веб-сайте, где вы можете добавлять / редактировать оценщика, а также добавлять / удалять продукты, которые этот оценщикпредложения. Вот скриншот для справки.
Когда я добавляю оценщика, связь между 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;
}