首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#实体框架核心-当子项被添加到软删除的父OnSave时抛出一个错误

C#实体框架核心-当子项被添加到软删除的父OnSave时抛出一个错误
EN

Stack Overflow用户
提问于 2020-11-26 22:34:12
回答 2查看 155关注 0票数 0

我有一堆包含用于DeletedAt特性的soft-delete列的表。我已经实现了大部分逻辑,除了一个问题,它允许将子记录添加到软删除的父记录之外,一切都正常工作。当DbContext.OnSave()运行并发现父记录(foreignKey)实际上是soft-deleted时,我想抛出一个异常。

在添加子元素之前,有什么方法可以插入过滤器或检查父DeletedAt字段吗?

我确实没有什么想法,但有点痛苦,需要遍历子模型中的所有foreignKeys,并检查父对象是否设置了DeletedAt

任何想法都将不胜感激。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-27 01:51:01

因此,我确实找到了一个解决方案,它也没那么糟糕,以下是对任何感兴趣的人(在代码访问DbContext.SaveChanges()之前)在DbContext文件中的实现:

代码语言:javascript
复制
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。

票数 0
EN

Stack Overflow用户

发布于 2020-11-26 23:06:07

EF可以使用的一个选项(在EF6中有些痛苦)是完全封装集合,以便通过父项添加项,允许您控制是否可以根据父项的当前状态添加项。

请参阅:https://ardalis.com/encapsulated-collections-in-entity-framework-core/

其基本原则是限制将子元素添加到父服务器上的一个名为AddChild(child)的方法中,该方法断言父服务器没有被软删除。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65030007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档