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
相关产品推荐
相关产品推荐

