第一次遇到这样的问题,网上查不到相关资料。
下面的代码运行良好
Exception_Perimetre = dc.Exception_Perimetre
.Where(x => x.Con_Con_Id == ConId
&& x.Exp_Date_Debut <= date
&& x.Exp_Date_Fin >= date)
.ToArray();
但随机使用后,抛出如下异常:
Property "Exp_Id" to "Exception_Perimetre" could not be set to a value "Decimal". You must assign a non-null value of type 'Guid' to this property.
原始值类型是 Guid 但出于某种原因 Entity Framework 试图将其转换为十进制...
有关信息,如果我在 IIS 上使用 Windows 身份连接,它运行良好。 我改成匿名连接后就开始失败了,希望这部分可以帮助别人找到解决方案;)
最佳答案
当从多个线程使用相同的上下文时会出现此问题。 DbContext 和 ObjectContext 不是线程安全的,不应在多线程中使用。我的猜测是,您的上下文是由 StructureMap 等 IoC 提供程序返回的,并且依赖项设置不正确,无法为所有请求返回相同的上下文。
当身份验证设置为 Windows Identity 时,为什么这会起作用?因为每个用户使用的连接字符串本质上是不同的,所以不会在用户之间共享同一个打开的连接。当您切换到匿名时,突然间每个用户看起来都一样,因此上下文最终共享同一个共享连接池。
这只是间歇性出现的原因是多线程问题。本质上发生的事情是 Connection 正在为请求 X 返回一个 Reader,但被请求 Y 使用。请求 Y 期望列序号 1 为 Guid,但请求 X 的列为 Decimal。
同样,我相信您的解决方法是解决您的 IoC 配置,或者您返回的是您的 Context 实例。
我希望这有助于解决问题。
关于c# - 为什么 Entity Framework 尝试将 Guid id 转换为十进制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14211225/