附加/未附加到dbContext的实体对象

时间:2014-01-24 03:43:50

标签: c# asp.net-mvc entity-framework entity-framework-6

我有以下EF数据声明:

class Model1{
    public Int32  Id{ get; set; }
    public string Prop1 { get; set; }
    public string Prop2 { get; set; }
    public string Prop3 { get; set; }
    public virtual Model3 PropModel31{ get; set; }
    public virtual Model3 PropModel32{ get; set; }
}
class Model3{
    public Int32  Id{ get; set; }
    public string Prop1 { get; set; }
    public string Prop2 { get; set; }
}

我在不同的地方请求我的实体:

//db being the datacontext
//Partial view of Model1
var model1s = from model1 in db.Model1
    select new {
                 model1.Id,
                 model1.Prop1,
                 model1.Prop2,
                 model1.PropModel31,
                 model1.PropModel32,
    };

之后,我正在尝试更新模型实体,

public ActionResult Save(Model1 model1)
{
    db.Model1.Attach(model1);
    var entry = db.Entry(model1);
    entry.Property(e => e.Prop1).IsModified = true;
    entry.Property(e => e.Prop2).IsModified = true;
    ...
    db.SaveChanges();
}

但我得到以下例外:

ObjectStateManager中已存在具有相同键的对象。 ObjectStateManager无法使用相同的键跟踪多个对象。

如果我评论 db.Model1.Attach(model1); ,那么我会得到相反的例外:/

无法为属性“Prop1”调用

成员“IsModified”,因为上下文中不存在“Model1”类型的实体。要向上下文添加实体,请调用DbSet的添加或附加方法

所以,我的猜测是Model3实体属性附加到上下文,但是如何检查,修复它?

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

嗯,异常被触发,因为其中一个子实体属性 PropModel31 被重置为new(Id = 0)。

例外情况并非如此。

感谢Andrew Counts一百万的时间和专业知识!

答案 1 :(得分:0)

您需要DbContext的新实例:

public ActionResult Save(Model1 model1)
{
    using (var ctx = new MyDbContext())
    {
        ctx.Model1.Attach(model1);
        var entry = ctx.Entry(model1);
        entry.Property(e => e.Prop1).IsModified = true;
        entry.Property(e => e.Prop2).IsModified = true;
        ...
        ctx.SaveChanges();
    }
}