EntityFramework.Extended.Update.Ambiguous column name
异常描述
c#代码 dbcontext.Table.Where(x => x.B > 0).Update( x => new Table() { A = x.B } ) 抛出异常:Ambiguous column name 'B'
测试环境
.net4.5 + EF6.0 + SQLServer2008
测试模型
测试1
try { using (var container = new TestModelContainer()) { var date = new DateTime(2017, 6, 2); container.TestEntity.Where(l => l.Date2 > date).Update(d => new TestEntity() { Date1 = d.Date2 }); Console.WriteLine("Done!"); } } catch (AggregateException err) { Console.WriteLine("Error! " + err.InnerException.Message); }
测试目的:结合Where和Update,datetime类型的表变量相互赋值,是否能通过
测试结果:
测试2
container.TestEntity.Where(l => l.Int2 == 2).Update(d => new TestEntity() { Int1 = d.Int2 });
container.TestEntity.Where(l => l.Int2 > 1).Update(d => new TestEntity() { Int1 = d.Int2 });
测试目的:结合Where和Update,int类型的表变量相互赋值,是否能通过
测试结果:
测试3
container.TestEntity.Where(l => l.Bool2 == false).Update(d => new TestEntity() { Bool1 = d.Bool2 });
测试目的:结合Where和Update,bit类型的表变量相互赋值,是否能通过
测试结果:
测试4
container.TestEntity.Where(l => l.Int2 == 2).Update(d => new TestEntity() { Int1 = 0 });
测试目的:结合Where和Update,int类型赋值为常量,是否能通过
测试结果:
测试5
container.TestEntity.Where(l => l.Bool2 == false).Update(d => new TestEntity() { Int1 = d.Int2 });
测试目的:Where语句中未出现赋值相关变量,int类型的表变量相互赋值,是否能通过
测试结果:
测试结论
1. 用常量赋值的情况一切正常。(测试4)
2. 用变量赋值的情况时,如果查询过滤条件中没有赋值变量的相关判断语句,执行正常。(测试5)
3. 用变量赋值的情况时,如果查询过滤条件中有赋值变量的相关判断语句,且对应变量类型为int时,会提示列名不明确(Ambiguous column name),(测试2)。
相同前提下,datetime和bit类型执行正常。(测试1|3)
4. 还有其他的数据库类型待测试,且待测可空数据类型。
附上测试1、2两种情况时,跟踪到的相关sql语句
测试1的sql语句
测试2的sql语句
结合以上sql语句,不难看出,ef.extended生成的异常sql语句导致了相应的报错。