我有以下的EF数据声明:实体对象连接/未连接到的DbContext
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);然后我得到相反的例外:/
成员'IsModified'不能被称为属性'Prop1',因为类型'Model1'的实体不存在于上下文中。要添加到上下文的实体调用添加或连接DbSet
这样的方法,我的猜测是,Model3实体属性附加到上下文,但如何才能检查,修复它?
谢谢你的帮助。
那么为什么你禁用变更跟踪,然后期待上下文跟踪变化呢? – Claies
对不起,您的问题不确定?假设我不需要任何跟踪,我怎样才能将我的实体保存在数据库中? – Yoann
这就是跟踪的要点,以便上下文知道模型与数据库相比有什么变化。使用AsNoTracking基本上会导致上下文没有跟踪的查找,因此,当您更改实体并尝试保存时,就会发生冲突,例如您正在添加与现有数据库项目冲突的新条目。 – Claies