两个线程和两个DataContext插入两次

本文关键字:两个 两次 插入 线程 DataContext | 更新日期: 2023-09-27 17:59:03

我有一个使用EF6 ORM的应用程序。

我有一个创建新对象的方法。我还有一个负责应用程序日志记录的线程。它对LogObject进行排队,并每5秒将其保存到数据库中。。

所以。用户调用方法来创建新对象:

using(DataContext context = new DataContext() {
   context.MyObjects.Add(new MyObject() { prop1 = "test" });
   context.SaveChanges(); // save #1
   Log("A new MyObject was created!"); // this method enqueues log info
}

记录器数据库的保存方法如下:

private void Flush() {
     using (DataContext db = new DataContext() {
         foreach(Log l in _logs) {
            db.Logs.Add(new LogObject() { propX = "blabla" });
         }
         db.SaveChanges(); // save #2
    }
}

保存#1会正确插入对象。问题是,save#2还插入了一个相同的MyObject()。。。。

我分析了数据库并调试了过程。

两个线程和两个DataContext插入两次

每当您看到这样的行为时,请考虑对象没有被上下文跟踪。您正在创建一个上下文并对其进行处理,因此对象可能不会被跟踪,对于EF,它被视为一个新对象,这就是再次插入它的原因。

您应该再次附加该对象,以便EF跟踪它并知道它不是新对象。

也许把它们放在同一个上下文中?据我所知,你只会记录数据库中发生的事情。。。。这将不需要"定时器功能"。或者选择另一个你有更多控制权的ORM。。。