当前位置: 首页 > 编程语言 > C#

更新实体列表的有效方法Share

时间:2023-04-11 00:42:44 C#

更新实体列表的有效方法我将这些实体映射到视图模型并使用编辑器字段显示它们。当用户按下提交按钮时,我遍历每个模型并像这样更新它:foreach(varviewModelinviewModels){//找到数据库模型并设置值并更新varentity=unit.EntityRepository.GetByID(fieldModel.ID);entity.Value=viewModel.Value;unit.EntityRepository.Update(实体);上面的代码有效,但如您所见,我们需要为每个实体访问数据库两次(一个用于检索,另一个用于更新)。使用EntityFramework有更有效的方法吗?我注意到每次更新都会生成一个单独的SQL语句。有没有办法在循环结束后提交所有更新?这里有两种我知道的更新数据库中的实体而不首先检索它的方法://假设人与上下文分离//对于这两个例子publicclassPerson{publicintId{get;放;}公共字符串名称{得到;放;}publicDateTimeBornOn{get;放;}}publicvoidUpdatePerson(Personperson){this.Context.Persons.Attach(person)DbEntityEntryentry=Context.Entry(person);entry.State=系统。数据.EntityState.Modified;上下文.SaveChanges();}shouldyield:Update[schema].[table]SetName=@p__linq__0,BornOn=@p__linq__1Whereid=@p__linq__2或者,您可以根据需要指定字段(可能适用于具有大量列的表,或者为了安全目的,只允许更新特定列:publicvoidUpdatePersonNameOnly(Personperson){this.Context.Persons.Attach(person)DbEntityEntryentry=Context.Entry(person);entry.Property(e=>e.Name)。IsModified=true;Context.SaveChanges();}应该yield:Update[schema].[table]SetName=@p__linq__0Whereid=@p__linq__1您可以尝试以下操作来最小化查询:使用(varctx=newMyContext()){varentityDict=ctx.Entities.W这里(e=>viewModels.Select(v=>v.ID)。包含(e.ID)).ToDictionary(e=>e.ID);//一个数据库查询foreach(varviewModelinviewModels){Entityentity;if(entityDict.TryGetValue(viewModel.ID,outentity))entity.Value=viewModel.Value;}ctx.SaveChanges();//具有多个UPDATE语句的单个事务}请注意,如果viewModel列表很长,则包含可能会很慢,但它只会运行一个查询。我不确定实体框架的测试版或RC中的当前版本是否支持批量更新之类的东西。但它们是Nuget上EF4.3.1的扩展http://nuget.org/packages/EntityFramework.Extended希望这可以帮助您实现HatSoft已经提到的EntityFramework.Extended的要求。有关基于扩展框架的示例,请参见下文。http://weblogs.asp.net/pwelter34/archive/2011/11/29/entity-framework-batch-update-and-future-queries.aspx以上就是C#学习教程:有效更新方法实体列表如果内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: