使用实体框架时,有有效的方法来实现更新行的逻辑(如果存在)存在或插入新行。
已附加对象
如果处理附加对象(从当前上下文实例加载的对象),请使用以下方法:
if (context.ObjectStateManager.GetObjectStateEntry(myEntity).State == EntityState.Detached) { context.MyEntities.AddObject(myEntity); } context.SaveChanges();
对象将自动跟踪更改,并且SaveChanges() 调用将根据需要执行更新或插入操作。
带键的非附加对象检查
如果对象的键值可用,您可以使用以下代码:
if (myEntity.Id != 0) { context.MyEntities.Attach(myEntity); context.ObjectStateManager.ChangeObjectState(myEntity, EntityState.Modified); } else { context.MyEntities.AddObject(myEntity); } context.SaveChanges();
此方法首先使用其 Id 属性检查对象是否存在。如果是,它将其附加到上下文并将其标记为已修改。否则,添加一个新对象。
没有键检查的非附加对象
当无法通过其键确定对象是否存在时,使用查找查询:
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();
此方法从数据库中获取与对象键匹配的行,并执行基于附件或添加的操作关于查询的结果。
以上是如何在实体框架中高效地更新或插入行?的详细内容。更多信息请关注PHP中文网其他相关文章!