我有一个在 .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();
}
}
}
任何帮助将不胜感激。
删除这两行:
myDbContext.myDbTable.Attach(myObject);
myDbContext.myDbTable.AddOrUpdate(myObject);
当您从
DbContext
读取实体时,默认情况下它是跟踪的实体引用。您可以更改值,只需针对 .SaveChanges()
调用 DbContext
,EF 将审核更改,自动创建适当的 UPDATE
语句。