C# EF5能否在基于事件的处理中正常工作

C# EF5能否在基于事件的处理中正常工作,c#,.net,performance,entity-framework,C#,.net,Performance,Entity Framework,我有一个事件处理程序的示例代码 public void ONDataArrived ( string data ) { //do some processing and save it to DB using EF ctx.Add ( x ) ; ctx.SaveChanges () ; } 如果此事件在同一时间触发两次,EF是否有可能出错 谢谢实体框架中的上下文对象不是线程安全的-因此它将中断。 您需要同步上下文,以防并行处理事件。EF 5可以在多个不同的模型中工作,具体取决于您

我有一个事件处理程序的示例代码

public void ONDataArrived ( string data ) 
{
//do some processing and save it to DB using EF 
ctx.Add ( x ) ; 
ctx.SaveChanges ()  ; 

}
如果此事件在同一时间触发两次,EF是否有可能出错


谢谢

实体框架中的上下文对象不是线程安全的-因此它将中断。

您需要同步上下文,以防并行处理事件。

EF 5可以在多个不同的模型中工作,具体取决于您希望如何使用它。有用于使用上下文跟踪实体、自跟踪实体或POCO的模板。对于您的情况,我建议不要保留上下文对象。自我跟踪实体可能就是您要寻找的——它们在内部存储更新数据库所需的所有信息,而不是依赖上下文来跟踪数据库


如果您选择自跟踪路径,那么OnDataArrival方法将只创建一个新的上下文对象并更新实体,这也将解决weismat提到的线程问题。

我在一个应用程序(单线程)中运行此方法,单线程中的事件是否可能并行运行?假设我没有添加任何异步代码,我同意Tim的观点,即您应该查看不同的模型。单个应用程序可以有多个线程,有时线程/任务会隐式创建线程。使用自跟踪实体无法解决多线程环境中可能出现的并发问题。自跟踪实体可以解决此问题,因为上下文不必保持打开状态。上下文仅在持久化实体的范围内打开,然后关闭。由于不需要跨调用持久化上下文,因此不必担心多个线程同时访问上下文。只要保证事件在不同的实体上工作,自跟踪实体就可以工作。