我知道之前已经问过,但在使用实体框架更新或删除记录时,我仍然无法解决以下错误:
我正在尝试使用以下代码更新一行,其中user变量是参数,传递给方法:
savedUser = context.Users.Attach(user);
context.Entry(user).State = EntityState.Modified;
context.SaveChanges();
我也使用相同的代码来更新2个其他实体,并且它有效。 另外,这是我的DataContext类:
public class DataContext : DbContext
{
public DbSet<User> Users { get; set; }
private static DataContext instance = new DataContext();
public static DataContext Instance
{
get { return DataContext.instance; }
}
public DataContext() : base("DataContext")
{
}
}
任何提示?
答案 0 :(得分:2)
似乎该实体已经附加,您无需再次附加它。因此,只有当实体尚未像这样附加时才需要调用attach:
bool isAttached = context.Users.Local.Any(x => x == user);
if(!isAttached)
contect.Users.Attach(user);
context.Entry(user).State = EntityState.Modified;
context.SaveChanges();
<强>更新强>
当使用先前用于加载操作(连接模式)的现有上下文时,请尝试以下操作:
context.Users.AddOrUpdate(user);
context.SaveChanges();
或者,尝试为每个主要操作(也称为断开模式)创建全新的上下文:
using(var newContext = new DataContext())
{
var attachedUser = newContext.Users.Attach(user);
newContext.Entry(attachedUser).State = EntityState.Modified;
newContext.SaveChanges();
}
根据我过去使用EF的经验,我建议使用断开连接模式(即为每个主要操作创建一个新的DbContext)。一个主要原因是DbContext无法从错误和异常中正确恢复,您可能需要手动管理其生命周期。在断开连接模式下,您将确信您将使用全新且干净的DbContext,而不必担心其状态。
答案 1 :(得分:0)
您似乎正在尝试添加已存在的记录,但您说您正在尝试删除该记录。无论哪种方式,this链接都可能对您有用。