如何获得导航属性与[Owned]属性跟踪在实体框架核心



我的项目默认关闭了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;
}

最新更新