我的项目默认关闭了EF跟踪。
我得到了一个DB模型类UserModel:
public class UserModel : BaseAdminDbModel
{
[Key]
public int UserId { get; set; }
[NotMapped]
public string UserName { get; set; }
[Required]
public RightsModel R { get; set; }
public BranchUserModel()
{
R = new RightsModel();
}
[ForeignKey("UserId")]
public UserDataModel User { get; set; }
}
RightsModel:
[Owned]
public class RightsModel
{
public bool? RightOne { get; set; }
public bool? RightTwo { get; set; }
public bool? RightN { get; set; }
}
我想在保存db上下文之前添加要跟踪的拥有导航属性,因此RightModel
中的UserModel
中的每个更改都将保存到数据库(目前其忽略这些字段)
我想有一些像这样:
_dbContext.Entry(model).State = EntityState.Modified;
foreach(var navigationRightProperty in _dbContext.Entry(model).Navigations)
{
navigationRightProperty.Load();
}
结果:
对RightModel的更改也将与主UserModel
实体一起跟踪。
模型跟踪是EF Core默认启用的。因此,如果您在请求并对其进行更改时使用R
属性上的Include方法,那么您调用SaveChanges
方法,所有更改将保存在数据库
var id = 1;
var model = _dbContext.UserModel.Include(x => x.R ).FirstOrDefalt(x => x.Id == id)
model.R.RightOne = true;
_dbContext.SaveChanges();
也可以更改UserModel
的构造函数,如
public UserModel()
{
this.R = new HashSet<RightsModel>();
}
过了一段时间我来解决这个问题。如果你在默认情况下开启了跟踪,并且想要依赖于真实的对象,那么Drakk L解决方案是很好的。
我想用更抽象的方式来实现这一点:
var navigationOwnedProps = _dbContext
.Entry(model)
.Navigations
.Where(e => e.Metadata
.ClrType.CustomAttributes.Any(c => c.AttributeType ==
typeof(OwnedAttribute))).Select(e => e.CurrentValue)
.ToList();
foreach (var nav in navigationOwnedProps)
{
_dbContext.Entry(nav).State = EntityState.Modified;
}