为什么实体框架试图将Guid ID转换为十进制?

时间:2013-01-08 08:47:17

标签: c# entity-framework

这是我第一次遇到这样的问题,我在网上找不到任何有关它的信息。

以下代码效果很好

Exception_Perimetre = dc.Exception_Perimetre
                      .Where(x => x.Con_Con_Id == ConId
                               && x.Exp_Date_Debut <= date 
                               && x.Exp_Date_Fin >= date)
                      .ToArray();

但在随机使用后,会抛出以下异常:

  

属性“Exp_Id”到“Exception_Perimetre”无法设置为“十进制”值。您必须为此属性指定“Guid”类型的非null值。

原始值类型是Guid,但由于某种原因,实体框架尝试将其转换为十进制...

有关信息,如果我在IIS上使用Windows身份连接,则效果很好。 在我改为匿名连接后,它开始失败,希望这部分可以帮助某人找到解决方案;)

1 个答案:

答案 0 :(得分:2)

当从多个线程使用相同的上下文时,会发生此问题。 DbContext和ObjectContext不是线程安全的,不应该在多个线程中使用。我的猜测是你的上下文是由像StructureMap这样的IoC提供程序返回的,并且依赖关系被错误地设置为所有请求返回相同的Context。

为什么在将身份验证设置为Windows身份时,这是否有效?因为正在使用的连接字符串对于每个用户而言本质上是不同的,因此没有跨用户共享相同的开放连接。当您切换到匿名时,突然每个用户看起来都一样,因此上下文最终共享同一个共享连接池。

这只是间歇性出现的原因是由于多线程问题。基本上发生的事情是Connection正在为请求X交回一个Reader,但是被请求Y消耗。请求Y期望列序号1是Guid,但请求X的列是十进制。

同样,我相信您的解决方案是解决您的IoC配置问题,或者您正在返回上下文的实例。

我希望这有助于澄清事情。