2012-10-10 152 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,這是不安全的使用從併發線程。