2012-10-10 151 views
1

跟着this question关于DbContext的线程安全性(事实并非如此),我需要知道在多线程中处理映射的POCO是否安全。EF对象是线程安全的吗?

假设我有使用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到t他的上下文:

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

我没有做任何与辅助线程中的上下文,但我操纵映射到它的对象。

我可以这样做吗?

+0

只要你保持一个持有dataContext的工作者类,并从中取出POCO,那么所有东西都应该是安全的,因为dataContext持有对象图 –

+0

你是什么意思'抛出POCO'?我只是用新的创造它们。 – zmbq

+0

我不相信你描述的场景是线程安全的,除非你使用某种形式的同步,否则你可能会遇到竞争条件。毕竟POCO课程只是基础课程。你为什么要诉诸线程? –

回答

1

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