Почему вложенную модель 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; }
}
в базе данных для всех ключей установленна спецификация (
)
в моем проекте используется 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?