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# EF对象是线程安全的吗?_C#_Entity Framework_Thread Safety_Ef Code First - Fatal编程技术网

C# EF对象是线程安全的吗?

C# EF对象是线程安全的吗?,c#,entity-framework,thread-safety,ef-code-first,C#,Entity Framework,Thread Safety,Ef Code First,关于DbContext的线程安全性(它不是),我需要知道在多个线程中处理映射的POCO是否安全 假设我使用CodeFirst将两个对象映射到数据库: class Poco1 { public int Id { get; set; } public string SomeProp {get; set;} public virtual List<Poco2> children { get; set; } } class Poco2 { public in

关于DbContext的线程安全性(它不是),我需要知道在多个线程中处理映射的POCO是否安全

假设我使用CodeFirst将两个对象映射到数据库:

class Poco1
{
    public int Id { get; set; }
    public string SomeProp {get; set;}
    public virtual List<Poco2> children { get; set; }
}

class Poco2
{
    public int id { get; set;}
    public Poco1 parent { get; set; }
}
然后我将其传递给一个任务,在任务中创建另一个对象并稍微更改父对象

var childPoco = new Poco2 { parent=parentPoco }; 
parentPoco.SomeProp = "Tasked!";
然后回到主线程,我将childPoco添加到上下文中:

_context.Poco2s.Add(childPoco);
_context.SaveChanges();
我没有在次线程中处理上下文,但我正在处理映射到它的对象


我可以这样做吗?

如果它们是“纯”POCO(没有更改跟踪或延迟加载),没有引用“原始”线程中使用的任何其他对象,那么您就没事了。但大多数人使用“不纯”,这是不安全的使用从一个并发线程

如果它们是“纯”POCO(没有更改跟踪或延迟加载),没有引用“原始”线程中使用的任何其他对象,那么您就没事了。但大多数人使用“不纯”,这是不安全的使用从一个并发线程

只要您保持一个worker类保存dataContext并从中抛出POCO,那么一切都应该是安全的,因为dataContext保存对象图,您说的“从中抛出POCO”是什么意思?我只是用new创建它们。我不相信您描述的场景是线程安全的,除非您使用某种形式的同步,否则您可能会遇到竞争条件。POCO类毕竟只是基本类。为什么要使用线程?我有一个异步MVC操作,我想在任务中操作POCO。我的同步没有问题,我担心DbContext使用的跨POCO和内部结构——我不知道这些结构,也无法同步。只要您保留一个包含dataContext的worker类并从中分发POCO,那么一切都应该是安全的,因为dataContext保存着对象图。您说的“从中分发POCO”是什么意思?我只是用new创建它们。我不相信您描述的场景是线程安全的,除非您使用某种形式的同步,否则您可能会遇到竞争条件。POCO类毕竟只是基本类。为什么要使用线程?我有一个异步MVC操作,我想在任务中操作POCO。我对同步没有问题,我担心DbContext使用的跨POCO和内部结构——我不知道也不能同步的结构。
_context.Poco2s.Add(childPoco);
_context.SaveChanges();