4

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

下面的代码运行良好

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”类型的非空值。

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

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

4

1 回答 1

2

当从多个线程使用相同的上下文时会出现此问题。DbContext 和 ObjectContext 不是线程安全的,不应在多个线程中使用。我的猜测是,您的上下文是由诸如 StructureMap 之类的 IoC 提供程序返回的,并且依赖项设置不正确,无法为所有请求返回相同的上下文。

为什么当身份验证设置为 Windows 身份时这会起作用?因为每个用户使用的连接字符串本质上是不同的,所以用户之间没有共享相同的打开连接。当您切换到匿名时,突然之间每个用户看起来都一样,因此上下文最终共享同一个共享连接池。

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

同样,我相信您的解决方法是解决您的 IoC 配置,或者您正在返回 Context 的一个实例。

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

于 2013-02-12T13:23:43.190 回答