两个线程和两个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()。。。。
我分析了数据库并调试了过程。
每当您看到这样的行为时,请考虑对象没有被上下文跟踪。您正在创建一个上下文并对其进行处理,因此对象可能不会被跟踪,对于EF,它被视为一个新对象,这就是再次插入它的原因。
您应该再次附加该对象,以便EF跟踪它并知道它不是新对象。
也许把它们放在同一个上下文中?据我所知,你只会记录数据库中发生的事情。。。。这将不需要"定时器功能"。或者选择另一个你有更多控制权的ORM。。。