1

这个关于 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; }
}

在主线程中,我正在加载 Poco1:

var parentPoco = _context.Poco1s.Where(...).Single();

然后我将它传递给一个任务,在那里我创建另一个对象并稍微更改父对象

var childPoco = new Poco2 { parent=parentPoco }; 
parentPoco.SomeProp = "Tasked!";

然后回到主线程,我将 childPoco 添加到上下文中:

_context.Poco2s.Add(childPoco);
_context.SaveChanges();

我没有对辅助线程中的上下文做任何事情,但我正在操作映射到它的对象。

我可以这样做吗?

4

1 回答 1

1

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

于 2012-10-11T13:06:43.523 回答