我有一堆包含用于DeletedAt特性的soft-delete列的表。我已经实现了大部分逻辑,除了一个问题,它允许将子记录添加到软删除的父记录之外,一切都正常工作。当DbContext.OnSave()运行并发现父记录(foreignKey)实际上是soft-deleted时,我想抛出一个异常。
在添加子元素之前,有什么方法可以插入过滤器或检查父DeletedAt字段吗?
我确实没有什么想法,但有点痛苦,需要遍历子模型中的所有foreignKeys,并检查父对象是否设置了DeletedAt。
任何想法都将不胜感激。谢谢。
发布于 2020-11-27 01:51:01
因此,我确实找到了一个解决方案,它也没那么糟糕,以下是对任何感兴趣的人(在代码访问DbContext.SaveChanges()之前)在DbContext文件中的实现:
var entry = Entry(childModel);
foreach(var prop in entry.CurrentValues.Properties)
{
// Handle FKs only
if(!prop.IsForeignKey()) continue;
var fkValue = entry.CurrentValues[prop.Name];
// Handle nullable properties and skip the checks if the value is null
if(prop.IsColumnNullable() && fkValue == null) continue;
// If value is null or 0 then break
if(fkValue == null || (int)fkValue == 0)
{
throw new Exception("Must contain a value.");
}
// Get the FK
var fk = prop.GetContainingForeignKeys().FirstOrDefault();
if(fk == null)
{
throw new Exception("FK constraint is not available.");
}
// If parent is not available or deleted
var parent = Find(fk.PrincipalEntityType.ClrType, new object[]{fkValue});
if(parent == null)
{
throw new Exception($"The entered FK value ({fkValue}) is not valid.");
}
}Find方法实际上有一个全局筛选器,用于检查是否设置了DeletedAt字段。如果记录不存在,这将失败。这应该是动态的,足以处理表中的所有FKs。
发布于 2020-11-26 23:06:07
EF可以使用的一个选项(在EF6中有些痛苦)是完全封装集合,以便通过父项添加项,允许您控制是否可以根据父项的当前状态添加项。
请参阅:https://ardalis.com/encapsulated-collections-in-entity-framework-core/
其基本原则是限制将子元素添加到父服务器上的一个名为AddChild(child)的方法中,该方法断言父服务器没有被软删除。
https://stackoverflow.com/questions/65030007
复制相似问题