ADO.NETEF4.1如何插入记录?我正在尝试完成一些非常简单的事情,但我无法使用EntityFramework4.1解决它。我想要一个接受对象然后执行UPSERT(插入或更新取决于数据库中是否存在记录)的控制器方法。我使用的是自然键,所以我无法查看我的POCO并判断它是否是新的。我就是这样做的,对我来说似乎不对:[HttpPost]publicJsonResultSaveMyEntity(MyEntityentity){MyContainerdb=newMyContainer();//DbContextif(ModelState.IsValid){varexisting=db.MyEntitys.Find(entity.MyKey);如果(现有==null){db.MyEntitys.Add(实体);}else{existing.A=entity.A;现有的.B=实体.B;db.Entry(现有).State=EntityState.Modified;}db.SaveChanges();返回Json(新{结果=“成功”});理想情况下,整个事情是这样的:db.MyEntities.AddOrModify(entity);不幸的是,如果不查询数据库或使用存储过程,就无法做到这一点。简约代码应该是:publicvoidAddOrModify(Tentity,stringkey)whereT:class,IEntity//ImplementsMyKey{using(varcontext=newMyContainer()){if(context.Set().Any(e=>e.MyKey==key)){context.Entry(entity).State=EntityState.Modified;}else{context.Entry(entity).State=EntityState.Added;}context.SaveChanges();在大多数情况下,不需要显式设置EntityState.Modified除非您禁用了更改跟踪。我们采用的解决方案是检查实体标识符的值:if(entity.Id==default(int)){//transiententitysoinsert}else{//update}实际上有一种方法可以通知数据库上下文,你试图插入的实体已经改变,现在是一个新的实体_context.MyEntity.Attach(entity);_context.MyEntity(entity).State=System.Data.EntityState.Modified;要执行UPSERT操作,您可能需要考虑创建一个实现MERGE的SP。http://www.databasejournal.com/features/mssql/article.php/3739131/UPSERT-Functionality-in-SQL-Server-2008.htm无论选择哪种方式,操作都必须是原始的,否则你会遇到一场比赛健康)状况。你的SP可能需要一个HOLDLOCK来取消这个......http://weblogs.sqlteam.com/dang/archive/2009/01/31/UPSERT-Race-Condition-With-MERGE.aspx我知道这个问题已经过时并且有一个公认的答案,但我认为有更好的解决方案:它不需要实现额外的接口或定义键类型。publicstaticclassDbSetExtensions{publicstaticEntityEntryAddIfNotExists(thisDbSetdbSet,TEntentity,Funcpredicate)其中TEnt:class{varexists=dbSet.Any(c=>predicate(entity).Equals(predicate(c)));回报存在吗?空:dbSet.Add(实体);}publicstaticvoidAddRangeIfNotExists(thisDbSetdbSet,IEnumerableentities,Funcpredicate)whereTEnt:class{varentitiesExist=fromentindbSetwhereentities.Any(add=>predicate(ent).Equals(predicate(add)))select耳鼻喉科;dbSet.AddRange(entities.Except(entitiesExist));所以后面可以这样用:插入记录?如果分享的内容对你有用,需要进一步了解C#学习教程,希望你多多关注——using(varcontext=newMyDbContext()){varuser1=newUser{Name="Peter",年龄=32};context.Users.AddIfNotExists(user1,u=>u.Name);varuser2=newUser{Name="Joe",Age=25};context.Users.AddIfNotExists(user2,u=>u.Age);//如果没有名为“Peter”的用户,则添加user1//如果存在,则添加user2没有25岁的用户context.SaveChanges();}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
