Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体对象已附加/未附加到dbContext_C#_Asp.net Mvc_Entity Framework_Entity Framework 6 - Fatal编程技术网

C# 实体对象已附加/未附加到dbContext

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

我有以下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的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中,那么您想要做的可能会起作用