实体框架提供了多种方法来管理“更新行(如果存在),否则插入新行”场景。
附加对象:
如果正在修改的实体已附加到上下文,可以直接更新:
if (context.ObjectStateManager.GetObjectStateEntry(myEntity).State == EntityState.Detached) { context.MyEntities.AddObject(myEntity); } // Attached object tracks modifications automatically context.SaveChanges();
具有已知密钥的非附加对象:
如果实体具有非零密钥(表示现有条目),它可以附加并修改为如下:
if (myEntity.Id != 0) { context.MyEntities.Attach(myEntity); context.ObjectStateManager.ChangeObjectState(myEntity, EntityState.Modified); } else { context.MyEntities.AddObject(myEntity); } context.SaveChanges();
具有未知密钥的非附加对象:
如果密钥未知,可以执行查找查询来确定是否存在:
var id = myEntity.Id; if (context.MyEntities.Any(e => e.Id == id)) { context.MyEntities.Attach(myEntity); context.ObjectStateManager.ChangeObjectState(myEntity, EntityState.Modified); } else { context.MyEntities.AddObject(myEntity); } context.SaveChanges();
以上是如何使用实体框架实现Upsert逻辑?的详细内容。更多信息请关注PHP中文网其他相关文章!