C# EF对象是线程安全的吗?
关于DbContext的线程安全性(它不是),我需要知道在多个线程中处理映射的POCO是否安全 假设我使用CodeFirst将两个对象映射到数据库: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
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();