问题描述
使用EntityFrameworkExtensionsUpdate的时候。测试代码的时候这样写是正常的。db.Students.Where(t=>t.Id==2).UpdateAsync(t=>newStudent(){Age=5});
(其中ID是主键)使用这个目地是直接更新单个字段时。而不想使用原来的整行update。接下来,在网站中使用了Repository。其中uddate代码是publicUpdate(Expression<Func<T,bool>>filterExpression,Expression<Func<T,T>>updateExpression,boolsave=true){if(filterExpression==null)thrownewArgumentNullException("filterExpression");if(updateExpression==null)thrownewArgumentNullException("updateExpression");varquery=Entities.Where(filterExpression);query.Update(updateExpression);if(save)SaveChanges();}
然后问题来了。这里会发生一个错误。序列包含一个以上的元素指向的代码行是query.Update(updateExpression);这句。这个问题已经困牢我很久了。。
解决方案
本帖最后由 jxnkwly 于 2014-12-20 17:36:20 编辑
解决方案二:
没用过update这个我通常更新用类似这样的语句DbEntityEntryentry=db.Entry<T>(model);entry.State=System.Data.EntityState.Modified;returndb.SaveChanges();当然、这是整行更新
解决方案三:
上图
解决方案四:
既然报错是说你提供的集合就是你的query经过updateExpression删选后的集合包含1条以上的数据,那么你就跟踪一下query.Where(updateExpression)得到的结果是有多少记录,如果是要更新多条,且他的update只接受1条,那你就一条条给他咯
解决方案五:
我都是整行更新的,这个没弄过
解决方案六:
引用3楼wjq的回复:
既然报错是说你提供的集合就是你的query经过updateExpression删选后的集合包含1条以上的数据,那么你就跟踪一下query.Where(updateExpression)得到的结果是有多少记录,如果是要更新多条,且他的update只接受1条,那你就一条条给他咯
EntityFrameworkExtensionsUpdate本来就是用来批量更新的,
解决方案七:
你的例子是UpdateAsync,你下面的实际是Update,这两个没可比性,你为啥认为前面的可以,后面的也要可以
解决方案八:
引用5楼jxnkwly的回复:
Quote: 引用3楼wjq的回复:
既然报错是说你提供的集合就是你的query经过updateExpression删选后的集合包含1条以上的数据,那么你就跟踪一下query.Where(updateExpression)得到的结果是有多少记录,如果是要更新多条,且他的update只接受1条,那你就一条条给他咯EntityFrameworkExtensionsUpdate本来就是用来批量更新的,
你的报错就是要求1条数据,前言不搭后语的我们也就帮你猜问题,“本来”的事情多着呢
解决方案九:
我用这个:
解决方案十:
我上一家公司就是用这种方式的我很不喜欢原因....不说了各有各的看法另外EF自带的更新是不会更新整行的你可以跟踪一下sql语句
解决方案十一:
引用9楼moonwrite的回复:
我上一家公司就是用这种方式的我很不喜欢原因....不说了各有各的看法另外EF自带的更新是不会更新整行的你可以跟踪一下sql语句
EF自己的更新是会整行更新的。
解决方案十二:
引用8楼webdiyer的回复:
我用这个:
用的就是这个。
解决方案十三:
说实话,除非某个字段内容特别大,还不如整行更新速度快呢。