Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 两个线程和两个DataContext插入两次_C#_Entity Framework - Fatal编程技术网

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

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("

我有一个使用EF6表单的应用程序

我有一个创建新对象的方法。我还有一个线程负责应用程序日志记录。它将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()


我分析了数据库并调试了进程

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


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

是否可以将它们放在相同的上下文中?据我所知,你只会记录数据库中的内容。。。。这不需要“定时器功能”。或者选择另一个您有更多控制权的ORM…

A将非常有用。如果“save#2”涉及到您在“save#1”中保存的对象,则可能会发生这种情况。您的问题似乎不是这样,但它可能不是真正的代码。
LogObject
是否有任何导航属性(可能是到
MyObject
)@BradleyUffner这就是问题所在。日志具有MyObject的导航属性。。。谢谢我相信弗朗西斯科的回答是正确的。尽管示例代码遗漏了导航属性,但他(间接地)做到了正确。