编写DbContext扩展方法后无法调用,报错无对应定义是什么原因?
问题根因
C# 中扩展方法本质是挂载在静态类下的静态方法,并非基类 DbContext 的原生实例成员。base 关键字的查找范围仅限基类的实例成员,不会检索已引入命名空间下的扩展方法,因此会抛出找不到定义的错误。
解决方案
- 直接将调用写法替换为
this.AreThereAnyChanges()即可:当前子类实例继承自DbContext,完全匹配扩展方法的参数类型要求,编译器会自动匹配到Data命名空间下的对应扩展方法。 - 也可以选择显式调用静态类的方法:
bool change = DbContextExtensions.AreThereAnyChanges(this);,执行效果和扩展方法调用完全一致。
额外提示:你当前在构造函数中调用该方法时,
DbContext的变更跟踪器还未加载任何实体,这个调用永远会返回false,如果需要检测实际业务操作的实体变更,建议将该调用移到构造执行完成后的业务逻辑中。
内容的提问来源于stack exchange,提问作者Onur Kayabaşı
相关产品推荐
相关产品推荐

