Почему вложенную модель EF Core не обновляет?

У меня есть Продукт, который имеет бренд и упаковку (модель, в которой есть другие модели)

public class ProductModel
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ProductId { get; set; }
    
    public int BrandId { get; set; }
    [ForeignKey("BrandId")]
    public virtual BrandModel Brand { get; set; }

    public virtual PackModel Pack { get; set; }
}

и

public class BrandModel
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int BrandId { get; set; }
    public string BrandName { get; set; }
    [JsonIgnore]
    public virtual ProductModel Product { get; set; }
    
}

и

public class PackModel
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int PackId { get; set; }

    public int ProductId { get; set; }
    [JsonIgnore]
    public virtual ProductModel Product { get; set; }
    public int PackWidth { get; set; }
}

в базе данных для всех ключей установленна спецификация (enter image description here)

в моем проекте используется UnitOfWork:

public class UnitOfWork : IUnitOfWork
    {
        private readonly ApplicationContext _context;
        public UnitOfWork(ApplicationContext context)
        {
            _context = context;
            BrandRepository = new BrandRepositories(_context);
            ProductRepository = new ProductRepositories(_context);
        }
        public IBrandRepositories BrandRepository { get; private set; }
        public IProductRepositories ProductRepository { get; private set; }
        public int Complete()
        {
            return _context.SaveChanges();
        }
        public void Dispose()
        {
            _context.Dispose();
        }
    }

и GenericRepository:

public interface IProductRepositories : IGenericRepository<ProductModel>
    {
    }

public interface IGenericRepository<T> where T : class
    {
        Task<T> UpdateAsyn(T t, object key);
    }

вот мой контекст

public class ApplicationContext : DbContext
{
    public ApplicationContext(DbContextOptions<ApplicationContext> options) : base(options)
    {
    }
    public DbSet<BrandModel> Brand { get; set; }
    public DbSet<ProductModel> Product { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<BrandModel>().ToTable("Brand").HasKey(k=>k.BrandId);
        modelBuilder.Entity<BrandModel>().Property(p => p.BrandId).IsRequired().HasMaxLength(30).ValueGeneratedOnAdd();

        modelBuilder.Entity<ProductModel>()
            .HasOne<BrandModel>(p => p.Brand)
            .WithOne(b => b.Product)
            .HasForeignKey<ProductModel>(pr => pr.BrandId);
        modelBuilder.Entity<ProductModel>().ToTable("Product").HasKey(k => k.ProductId);
        modelBuilder.Entity<ProductModel>().Property(p => p.ProductId).IsRequired().ValueGeneratedOnAdd();

        modelBuilder.Entity<ProductModel>()
            .HasOne<PackModel>(a => a.Pack)
            .WithOne(b => b.Product)
            .HasForeignKey<PackModel>(b => b.ProductId);

        modelBuilder.Entity<PackModel>().ToTable("Pack").HasKey(k => k.PackId);
    }
}

Я хочу чтобы я мог изменять модель (не очень много вроде как) и для этого я сделал простой метод

public virtual async Task<T> UpdateAsyn(T t, object key)
        {
            if (t == null)
                return null;
            T exist = await _context.Set<T>().FindAsync(key);
            _context.Entry(exist).State = EntityState.Detached;
            if (exist != null)
            {
                try
                {
                    _context.Entry(exist).CurrentValues.SetValues(t);
                    await _context.SaveChangesAsync();
                }
                catch (Exception e)
                {
                    _logger.Error($"GenericRepository:UpdateAsyn >>> Message: {e.Message}, StackTrace: {e.StackTrace}");
                    throw;
                }
                
            }
            return exist;
        }

На вход метода (Т) у меня подается модель Products, в которой есть 2 модели BrandModel and PackModel. Когда я делаю изменения в модели PackModel, то ентити не понимает что были изменения и ничего с ней не делает. я пробовал сделать EntityState.Detached, но это не помогло.

Как делают обновления с EF Core?


Ответы (0 шт):