提问人:Peter Morris 提问时间:11/16/2023 最后编辑:Peter Morris 更新时间:11/17/2023 访问量:144
删除时,是否可以阻止 EFCore 更改实体的状态?
Can I stop EFCore from altering my Entity's state when I delete?
问:
我有以下典型的父/子类,此外,我的所有域实体都来自一个类,该类具有返回所属对象的方法。EntityBase
public abstract class EntityBase
{
public abstract EntityBase GetRoot();
}
public class Parent : EntityBase
{
private readonly List<Child> _children = new();
public IReadOnlyList<Child> Children => _children.AsReadonly();
public void RemoveChild(Child child)
{
_children.Remove(child);
}
public override GetRoot() => this;
}
public class Child : EntityBase
{
public Parent Parent { get; init; }
public string Name { get; set; } = "";
public override GetRoot() => Parent;
}
如果我的 DbContext 中有一些代码可以遍历所有修改的实体,请调用它们,以确保它们的根(即父)状态设置为如果是这样,以便我有一个中心点来检查数据库更新冲突。GetRoot()
EntityEntry
Modified
Unchanged
这适用于修改,但是当我调用并且我的 DbContext 尝试保存更改时,我的代码会调用已删除的子对象并接收,而不是从 Db 获取的父对象。parent.RemoveChild(parent.Children[0])
GetRoot
null
似乎仅仅执行以获取已修改条目的列表就会改变我的属性的状态。ChangeTracker.Entries
Child.Parent
有没有办法在不发生这种情况的情况下获得列表?ChangeTracker.Entries
这是我之前在我的 .SaveChangesAsync
ApplicationDbContext
private void EnsureModifiedEntitiesAggregateRootsAreUpdated(EntityEntry[] modifiedEntries)
{
foreach (var entry in modifiedEntries)
{
if (entry.State != EntityState.Unchanged)
{
var entity = (EntityBase)entry.Entity;
// THIS NEXT LINE ALWAYS RETURNS NULL!
var aggregateRoot = entity.GetAggregateRoot();
EntityEntry<EntityBase> aggregateRootEntry = Entry(aggregateRoot);
if (aggregateRootEntry.State == EntityState.Unchanged)
{
aggregateRootEntry.State = EntityState.Modified;
}
}
}
}
我的应用代码可以做到这一点
- 获取父项并用于检索子项
.Include
parent.Items.RemoveAt(0);
- SaveChangesAsync
答: 暂无答案
评论
_child.AsReadonly()
_children.AsReadonly()
.Include(x => x.Parent)