gpt4 book ai didi

c# - 尽管从导航集合中删除了一个实体,但 Entity Framework 6 ChangeTracker 条目都没有改变

转载 作者:行者123 更新时间:2023-11-30 22:53:50 24 4
gpt4 key购买 nike

我正在覆盖我的 DbContext SaveChanges 方法并捕获 ChangeTracker 条目。

public override int SaveChanges()
{
var entries = ChangeTracker.Entries();
return base.SaveChanges();
}

我有一个名为“Range”的实体,它具有指向另一个名为“Feature”的实体的导航属性

public class Range
{
//other code
public virtual ICollection<Feature> Features { get; set; }
}

我要从范围中删除一个特征,然后保存更改

var featureToRemove = range.Features.First(f => f.ID == featureId);
range.Features.Remove(featureToRemove);
centralProducts.SaveChanges();

调用此代码后,该功能已成功删除,但 ChangeTracker 中的条目的 EntityStatus 均为 Unchanged(而不仅仅是相关范围实体)。

有些东西正在改变,或者数据库不会更新。

有什么方法可以在 SaveChanges 方法中捕获此更改?从导航属性中删除某些内容时,Unchanged 真的是我希望看到的状态吗?

我知道实际更改的表称为 Range_Features,既不是范围也不是特征本身。

最佳答案

如前所述,EF 会跟踪关系的变化。我能够使用以下扩展方法捕获这些更改

public static class IaExtensions
{
public static IEnumerable<Tuple<object, object>> GetAddedRelationships(
this DbContext context)
{
return GetRelationships(context, EntityState.Added, (e, i) => e.CurrentValues[i]);
}

public static IEnumerable<Tuple<object, object>> GetDeletedRelationships(
this DbContext context)
{
return GetRelationships(context, EntityState.Deleted, (e, i) => e.OriginalValues[i]);
}

private static IEnumerable<Tuple<object, object>> GetRelationships(
this DbContext context,
EntityState relationshipState,
Func<ObjectStateEntry, int, object> getValue)
{
context.ChangeTracker.DetectChanges();
var objectContext = ((IObjectContextAdapter)context).ObjectContext;

return objectContext
.ObjectStateManager
.GetObjectStateEntries(relationshipState)
.Where(e => e.IsRelationship)
.Select(
e => Tuple.Create(
objectContext.GetObjectByKey((EntityKey)getValue(e, 0)),
objectContext.GetObjectByKey((EntityKey)getValue(e, 1))));
}
}

参见 this answer了解更多详情

关于c# - 尽管从导航集合中删除了一个实体,但 Entity Framework 6 ChangeTracker 条目都没有改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56832802/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com