C# 两个线程和两个DataContext插入两次
我有一个使用EF6表单的应用程序 我有一个创建新对象的方法。我还有一个线程负责应用程序日志记录。它将LogObject排入队列,并每5秒将其保存到数据库中 所以。用户调用该方法以创建新对象:C# 两个线程和两个DataContext插入两次,c#,entity-framework,C#,Entity Framework,我有一个使用EF6表单的应用程序 我有一个创建新对象的方法。我还有一个线程负责应用程序日志记录。它将LogObject排入队列,并每5秒将其保存到数据库中 所以。用户调用该方法以创建新对象: using(DataContext context = new DataContext() { context.MyObjects.Add(new MyObject() { prop1 = "test" }); context.SaveChanges(); // save #1 Log("
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()
我分析了数据库并调试了进程 < P>每当您看到这样的行为时,请考虑对象没有被上下文跟踪。您正在创建一个上下文并对其进行处理,因此对象可能不会被跟踪,对于EF,它被视为一个新对象,这就是再次插入该对象的原因
您应该再次附加该对象,以便EF跟踪它并知道它不是新对象。是否可以将它们放在相同的上下文中?据我所知,你只会记录数据库中的内容。。。。这不需要“定时器功能”。或者选择另一个您有更多控制权的ORM…A将非常有用。如果“save#2”涉及到您在“save#1”中保存的对象,则可能会发生这种情况。您的问题似乎不是这样,但它可能不是真正的代码。
LogObject
是否有任何导航属性(可能是到MyObject
)@BradleyUffner这就是问题所在。日志具有MyObject的导航属性。。。谢谢我相信弗朗西斯科的回答是正确的。尽管示例代码遗漏了导航属性,但他(间接地)做到了正确。