我有以下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实体属性附加到上下文,但是如何检查,修复它?
感谢您的帮助。
答案 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();
}
}