C# 实体对象已附加/未附加到dbContext
我有以下EF数据声明:C# 实体对象已附加/未附加到dbContext,c#,asp.net-mvc,entity-framework,entity-framework-6,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
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的add或Attach方法
所以,我猜Model3实体属性是附加到上下文的,但是如何检查它,修复它呢
谢谢你的帮助 您需要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();
}
}
您需要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();
}
}
触发异常是因为子实体属性PropModel31中的一个重置为new(Id=0) 例外情况并不是很明确
非常感谢Andrew Counts的时间和专业知识 那么,触发异常是因为一个子实体属性PropModel31被重置为new(Id=0) 例外情况并不是很明确
非常感谢Andrew Counts的时间和专业知识 不幸的是,同样的问题。不幸的是,同样的问题。那么,为什么您要禁用更改跟踪,然后期望上下文跟踪更改?抱歉,您的问题不确定?假设我不需要任何跟踪,如何将我的实体保存在数据库中?这就是跟踪的重点,以便上下文知道与数据库相比,模型中发生了什么变化。使用AsNoTracking基本上会导致上下文不跟踪的查找,因此当您更改实体并尝试保存时,会出现冲突,就像您添加的新条目与现有数据库项冲突一样。此外,您还有延迟加载的导航属性,这些属性将在访问时被跟踪,因为延迟加载延迟了查找。如果您在导航属性上使用
.Include()
强制将它们加载到同一个调用中,那么您想要做的可能会起作用。让我们来看看,为什么您要禁用更改跟踪,然后希望上下文跟踪更改?抱歉,您的问题不太清楚?假设我不需要任何跟踪,如何将我的实体保存在数据库中?这就是跟踪的重点,以便上下文知道与数据库相比,模型中发生了什么变化。使用AsNoTracking基本上会导致上下文不跟踪的查找,因此当您更改实体并尝试保存时,会出现冲突,就像您添加的新条目与现有数据库项冲突一样。此外,您还有延迟加载的导航属性,这些属性将在访问时被跟踪,因为延迟加载延迟了查找。如果您在导航属性上使用.Include()
,强制将它们加载到同一个calllet中,那么您想要做的可能会起作用