You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EF重写SaveChanges方法时如何判断对象是否继承自自定义基类

解决方案:在EF SaveChanges中识别自定义基类并调用方法

这事儿其实挺简单的,C#里有两种常用的方式可以帮你判断实体是否继承自BaseClass,还能直接调用它的DoSomething方法,完美适配你的需求——让B、C类执行方法,D类跳过。

方法一:使用C# 7.0+的模式匹配(推荐)

这种方式最简洁,is关键字可以同时完成类型判断和类型转换,一步到位:

public override int SaveChanges()
{
    var changedEntities = ChangeTracker.Entries()
        .Where(e => e.State == EntityState.Added || e.State == EntityState.Modified);

    foreach (var entry in changedEntities)
    {
        // 检查实体是否是BaseClass或其子类的实例,同时转换为BaseClass类型
        if (entry.Entity is BaseClass baseEntity)
        {
            baseEntity.DoSomething();
        }
    }

    return base.SaveChanges();
}

方法二:使用as关键字兼容老版本C#

如果你的项目用的是C# 7.0之前的版本,可以用as关键字先尝试转换,再判断是否为null:

public override int SaveChanges()
{
    var changedEntities = ChangeTracker.Entries()
        .Where(e => e.State == EntityState.Added || e.State == EntityState.Modified);

    foreach (var entry in changedEntities)
    {
        // 尝试将实体转换为BaseClass,转换失败会返回null
        var baseEntity = entry.Entity as BaseClass;
        if (baseEntity != null)
        {
            baseEntity.DoSomething();
        }
    }

    return base.SaveChanges();
}

关键注意点

一定要记得操作的是entry.Entity,而不是entry本身——ChangeTracker.Entries()返回的是EF的实体跟踪对象,真正的业务实体存在它的Entity属性里,这是很容易忽略的细节!

这样写之后,所有继承自BaseClass的实体(比如B和C)都会被检测到并执行DoSomething,而只继承EntityData的D类会被自动忽略,完全符合你的要求。

内容的提问来源于stack exchange,提问作者Kristian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:40:48