2014-01-24 26 views
2

我有以下的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实体属性附加到上下文,但如何才能检查,修复它?

谢谢你的帮助。

+0

那么为什么你禁用变更跟踪,然后期待上下文跟踪变化呢? – Claies

+0

对不起,您的问题不确定?假设我不需要任何跟踪,我怎样才能将我的实体保存在数据库中? – Yoann

+0

这就是跟踪的要点,以便上下文知道模型与数据库相比有什么变化。使用AsNoTracking基本上会导致上下文没有跟踪的查找,因此,当您更改实体并尝试保存时,就会发生冲突,例如您正在添加与现有数据库项目冲突的新条目。 – Claies

回答

3

那么,是触发异常,因为子实体属性PropModel31的一个重置为新的(与ID = 0)。

这个例外并不十分明确。

非常感谢Andrew Counts的时间和专业知识!

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(); 
    } 
} 
+0

same问题不幸。 – Yoann