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();
我没有做任何与辅助线程中的上下文,但我操纵映射到它的对象。
我可以这样做吗?
只要你保持一个持有dataContext的工作者类,并从中取出POCO,那么所有东西都应该是安全的,因为dataContext持有对象图 –
你是什么意思'抛出POCO'?我只是用新的创造它们。 – zmbq
我不相信你描述的场景是线程安全的,除非你使用某种形式的同步,否则你可能会遇到竞争条件。毕竟POCO课程只是基础课程。你为什么要诉诸线程? –