如果您正在使用附加对象(从上下文的同一实例加载的对象),则可以简单地使用:
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();
如果无法通过其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();
谢谢。看起来像我所需要的。我可以问一个困扰我一段时间的问题吗?通常,我会将上下文放在一小段
using
。将上下文保留在内存中一段时间可以吗?例如,在Windows窗体的生命周期内?我通常会尝试清理数据库对象以确保最小的数据库负载。等待破坏我的EF环境是否没有问题?检查以下内容:stackoverflow.com/questions/3653009/…对象上下文应尽可能短地存在,但是对于Winforms或WPF,这可能意味着上下文与演示者一样长。链接的问题包含有关在Winforms中使用nhibernate会话的msdn文章的链接。相同的方法可以用于上下文。
但是,如果我需要使用对象列表执行此操作...在我的数据库中,存在具有相同ID的行列表,并且如果存在则想替换,或者如果不存在则要插入..我该怎么做?谢谢!
这个答案看起来很棒,但是我在更新时就遇到了这个问题:ObjectStateManager中已经存在具有相同键的对象。ObjectStateManager无法使用相同的键跟踪多个对象。
看起来我在获取现有对象以便在执行更新之前检索其密钥时遇到了一个问题;分离该查找对象首先有助于修复它。