c# - 为什么 Entity Framework 尝试将 Guid id 转换为十进制?

标签 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();

但随机使用后,抛出如下异常:

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/

相关文章:

c# - 编辑 EF 实体列表的有效方法

c# - 如何通过屏幕键盘与其他软件进行通信?

c# - SplitView.PaneClosed 事件可用但不适用于 PaneOpened

c# - 在同一个项目中同时使用 AddDbContextFactory() 和 AddDbContext() 扩展方法

c# - 如何基于自定义属性添加一对多关系

c# - Entity Framework 不生成 ApplicationUser 外键

c# - 我应该如何使用 Entity Framework 实体分部类?

c# - ASP.NET:重定向到用户的主页

c# - 接口(interface)注解

c# - 是否可以使用 SQLiteConnection 库检查 SQLite 数据库是否被锁定