实体框架 - 更新记录

时间:2014-12-03 02:11:42

标签: c# entity-framework

我知道之前已经问过,但在使用实体框架更新或删除记录时,我仍然无法解决以下错误:

enter image description here

我正在尝试使用以下代码更新一行,其中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")
    {
    }
}

任何提示?

2 个答案:

答案 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链接都可能对您有用。