为什么实体框架说对象附加到不同的ObjectContext对象?

问题描述 投票:0回答:1

我有一个在 .Net 4.7.2 上运行的 Webforms 应用程序,在某些情况下,从已在模式窗口中实例化的 UI 调用以下代码,在其他情况下,从主窗口中的 UI 调用它.

MyClass 类并不直接位于 aspx.cs 代码隐藏中,而是作为依赖项注入到代码隐藏中。

myDbContext 通过依赖注入注入到 MyClass 中。

两者都是使用 ".AddScoped()" 方法注入的。

当从模态窗口调用 MyMethod 时,一切都按预期工作;但是当从主窗口调用它时,“myDbContext.myDbTable.Attach(myObject)”会抛出以下错误: “无法定义两个对象之间的关系,因为它们附加到不同的 ObjectContext 对象。”

我不明白为什么当代码明显使用单个上下文时会抛出异常。有什么想法吗?

这是代码:

public class MyClass : IMyClass
{    
    private readonly myDbContext;

    public MyClass(DTSEFContainer context){
        myDbContext = context;
    }

    public void MyMethod(){
        var myObject = myDbContext.myDbTable.Where(a => a.ID == 1234).FirstOrDefault();
        if (myObject != null)
        {
            myObject.Name = name;
            myObject.Updated = DateTime.Now();

            myDbContext.myDbTable.Attach(myObject);
            myDbContext.myDbTable.AddOrUpdate(myObject);    
            myDbContext.SaveChanges();                
        }
    }
}

任何帮助将不胜感激。

c# entity-framework dependency-injection webforms
1个回答
0
投票

删除这两行:

        myDbContext.myDbTable.Attach(myObject);
        myDbContext.myDbTable.AddOrUpdate(myObject);    

当您从

DbContext
读取实体时,默认情况下它是跟踪的实体引用。您可以更改值,只需针对
.SaveChanges()
调用
DbContext
,EF 将审核更改,自动创建适当的
UPDATE
语句。

© www.soinside.com 2019 - 2024. All rights reserved.