efcore 更改修改状态以更新实体不适用于子数据对象
efcore change modified state to update entity is not working with sub data objects
我使用此更新代码设置了一个通用存储库
private void AttachIfNot(TEntity entityToActive)
{
if (_dbContext.Entry(entityToActive).State == EntityState.Detached)
{
_dbSet.Attach(entityToActive);
}
}
private void UpdateEntity(TEntity entityToUpdate)
{
AttachIfNot(entityToUpdate);
_dbContext.Entry(entityToUpdate).State = EntityState.Modified;
}
它只是附加实体并将修改后的状态设置为保存。
但是当我使用efocre ownsone 映射值对象时,更新实体功能不起作用。
我发现只有当我也将 Valueobject 设置为 modified 时它才有效。
_dbContext.Entry(entityToUpdate).State = EntityState.Modified;
_dbContext.Entry(entityToUpdate.Valueobject).State = EntityState.Modified;
但是我很难在通用存储库中指定所有值对象。
这段代码在一对多或其他关系方面也存在问题。
工作方式是这样的:
Classroom classroom = new Classroom
{
Id = 1,
Name = "b",
Students = new List<Student>
{
new Student()
{
Name = "aa",
Id = 2
}
}
};
if (_defaultDbContext.Entry(classroom).State == EntityState.Detached)
{
_defaultDbContext.Classrooms.Attach(classroom);
foreach(var stu in classroom.Students)
{
_defaultDbContext.Students.Attach(stu);
}
}
_defaultDbContext.Entry(classroom).State = EntityState.Modified;
foreach (var stu in classroom.Students)
{
_defaultDbContext.Entry(stu).State = EntityState.Modified;
}
_defaultDbContext.SaveChanges();
我发现一种方法是获取实体表单 repo,然后使用 automapper 更新它:
targetEntity = repo.GetById(entityId);
automapper.map(souceEntity,targetEntity);
//or
automapper.map(souceDto,targetEntity);
_dbContext.Save();
实体是查询而来的,所以会跟踪变化。
但是当我想更改实体时,我必须使用这个实体映射配置自动映射器
CreateMap<EntityType, EntityType>();
我认为这不是最佳解决方案。有更好的方法吗?
DbContext.Update 可以解决这个问题。
见:
https://www.learnentityframeworkcore.com/dbcontext/change-tracker
我使用此更新代码设置了一个通用存储库
private void AttachIfNot(TEntity entityToActive)
{
if (_dbContext.Entry(entityToActive).State == EntityState.Detached)
{
_dbSet.Attach(entityToActive);
}
}
private void UpdateEntity(TEntity entityToUpdate)
{
AttachIfNot(entityToUpdate);
_dbContext.Entry(entityToUpdate).State = EntityState.Modified;
}
它只是附加实体并将修改后的状态设置为保存。
但是当我使用efocre ownsone 映射值对象时,更新实体功能不起作用。
我发现只有当我也将 Valueobject 设置为 modified 时它才有效。
_dbContext.Entry(entityToUpdate).State = EntityState.Modified;
_dbContext.Entry(entityToUpdate.Valueobject).State = EntityState.Modified;
但是我很难在通用存储库中指定所有值对象。
这段代码在一对多或其他关系方面也存在问题。 工作方式是这样的:
Classroom classroom = new Classroom
{
Id = 1,
Name = "b",
Students = new List<Student>
{
new Student()
{
Name = "aa",
Id = 2
}
}
};
if (_defaultDbContext.Entry(classroom).State == EntityState.Detached)
{
_defaultDbContext.Classrooms.Attach(classroom);
foreach(var stu in classroom.Students)
{
_defaultDbContext.Students.Attach(stu);
}
}
_defaultDbContext.Entry(classroom).State = EntityState.Modified;
foreach (var stu in classroom.Students)
{
_defaultDbContext.Entry(stu).State = EntityState.Modified;
}
_defaultDbContext.SaveChanges();
我发现一种方法是获取实体表单 repo,然后使用 automapper 更新它:
targetEntity = repo.GetById(entityId);
automapper.map(souceEntity,targetEntity);
//or
automapper.map(souceDto,targetEntity);
_dbContext.Save();
实体是查询而来的,所以会跟踪变化。
但是当我想更改实体时,我必须使用这个实体映射配置自动映射器
CreateMap<EntityType, EntityType>();
我认为这不是最佳解决方案。有更好的方法吗?
DbContext.Update 可以解决这个问题。 见:
https://www.learnentityframeworkcore.com/dbcontext/change-tracker