我有一个使用EF6 ORM的应用程序。
我有一个创建新对象的方法。我还有一个负责应用程序日志记录的线程。它将LogObject排队并每5秒将其保存到数据库中..
因此。用户调用该方法来创建新对象:
map_size
记录器数据库保存方法如下:
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
}
save#1正确插入对象。 问题是save#2还插入了一个相同的MyObject()....
我分析了数据库并调试了进程。
答案 0 :(得分:1)
每当您看到这样的行为时,请考虑上下文未跟踪该对象。您正在创建上下文并对其进行处理,以便可能无法跟踪对象,而对于EF,它被视为新对象,这就是它再次插入的原因。
您应该再次附加对象,以便EF跟踪它并且知道它不是新对象。
答案 1 :(得分:0)
将它们放在相同的上下文中可能吗?根据我的理解,你只会记录进入数据库的内容......这不需要"定时器功能"。或者选择另一个有更多控制权的ORM ......