EF Core 7中使用ExecuteUpdateAsync的SetProperty设置Null时出现调用歧义错误的问题
EF Core 7中使用ExecuteUpdateAsync的SetProperty设置Null时出现调用歧义错误的问题
嗨,这个问题我之前也碰到过!其实根源是编译器没法区分SetProperty的两个重载方法,导致出现了调用歧义。
咱们先理清楚为什么会这样:EF Core的ExecuteUpdateAsync里的SetProperty有两个常用重载:
- 一个是直接给属性设置固定值:
SetProperty(Func<TSource, TProperty>, TProperty) - 另一个是通过表达式计算新值:
SetProperty(Func<TSource, TProperty>, Func<TSource, TProperty>)
当你直接传null给第二个参数时,编译器懵了——它不知道你是想把ClassId设为null这个固定值,还是想传入一个返回null的表达式。尤其是当ClassId是可空值类型(比如int?)的时候,这个歧义就更明显了。
那怎么解决呢?给你几个简单的方案:
方案1:强制转换null为属性的类型
直接把null转换成ClassId对应的可空类型,告诉编译器这是一个固定值:
.SetProperty(UserAccess => UserAccess.ClassId, (int?)null)
方案2:明确指定泛型参数
直接在SetProperty上写明泛型类型,让编译器精准匹配重载:
.SetProperty<UserAccess, int?>(UserAccess => UserAccess.ClassId, null)
方案3:使用default关键字指定类型
用default(你的属性类型)来代替null,效果和强制转换一样:
.SetProperty(UserAccess => UserAccess.ClassId, default(int?))
修正后的完整代码示例(用方案1的话):
public async Task<int> RemoveClassify(RemoveClassifyVm vm) { return await _db.UserAccesses .Where(UserAccess => vm.userAccessIds.Any(userAccessId => userAccessId == UserAccess.Id)) .ExecuteUpdateAsync(UserAccess => UserAccess .SetProperty(UserAccess => UserAccess.ClassId, (int?)null) ); }
本质上就是让编译器明确知道你要调用的是“设置固定值”的那个重载,歧义自然就消失啦。
备注:内容来源于stack exchange,提问作者Mohammad Komaei
相关产品推荐
相关产品推荐

