c# - 从具体化 'System.Guid' 类型到 'System.Int32' 类型的指定转换无效

标签 c# wcf sql-server-2008 sql-server-2005 entity-framework-4

从物化“System.Guid”类型到“System.Int32”类型的指定转换无效。

我们有几个 WCF 服务,它们具有 Multiple 并发模式和 Single 的 InstanceContextMode。我们的架构专注于使用基于构造函数的依赖注入(inject)的松散耦合模型。这又是使用 Unity 2.0 实现的(每个服务的 web.config 都在统一容器部分中定义的接口(interface)和类型之间进行映射)。我们的依赖项之一是使用 Entity Framework 4 与 MSSql Server 通信的 DAL 程序集(数据访问层)。与数据库对话的类也包含在统一映射中。

当我们运行集成测试时,一切都很好。但是,当我们转到性能环境以运行负载测试(2、3、4 个并发用户)时,我们开始看到以下错误:

System.InvalidOperationException:“Session”上的“auth_token”属性无法设置为“Int32”值。您必须将此属性设置为“Guid”类型的非空值。

使用以下堆栈:

at System.Data.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader`1.GetValue(DbDataReader reader, Int32 ordinal)
at System.Data.Common.Internal.Materialization.Shaper.GetPropertyValueWithErrorHandling[TProperty](Int32 ordinal, String propertyName, String typeName)
at lambda_method(Closure , Shaper )
at System.Data.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly[TEntity](Func`2 constructEntityDelegate, EntityKey entityKey, EntitySet entitySet)
at lambda_method(Closure , Shaper )
at System.Data.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper)
at System.Data.Common.Internal.Materialization.Shaper`1.SimpleEnumerator.MoveNext()
at System.Linq.Enumerable.First[TSource](IEnumerable`1 source)
at System.Linq.Queryable.First[TSource](IQueryable`1 source)
at MISoa.DataAccessLayer.Authentication.AuthenticationDB.RetrieveSession(Guid authToken)
at MISoa.DataAccessLayer.Authentication.AuthenticationAccess.RetrieveSession(String sessionToken)

这是罪魁祸首的方法:

public Session RetrieveSession(Guid authToken)
    {
        CheckDBContext();
        var sessions = (from r in _dbContext.Sessions
                where r.auth_token == authToken
                select r);
        return sessions.Count() > 0 ? sessions.First() : null;
    }

CheckDBContext 方法只是检查数据库上下文是否为空,如果是,则抛出自定义异常。

emdx Session 实体对象具有以下公共(public)属性:

Guid auth_token
DateTime time_stamp
String user_id
String app_id

所以,看起来有时上面的 linq 从数据库返回一些其他对象,其中第一列是 int 而不是 guid?如果是这样 - 为什么?我有多个线程覆盖彼此的数据库上下文的问题吗?顺便说一句——我们将实例化数据库上下文的代码抽象为一个单独的类 (BaseDB),该类也由 unity 处理。所以,因为该服务是单例的,所以我为每个人准备了一个 BaseDB 实例,对吗?这是这里的问题吗?

哦,还有一件事。我们被告知我们将拥有 MSSql 2005,因此在 edmx 文件中我们拥有 ProviderManifestToken="2005"。但是我刚刚检查了一下,我们的性能数据库所在的服务器是 2008 版本。这是一个问题吗?

感谢您的帮助。

最佳答案

Do I have a problem with multiple threads overriding each other's db context?

是的。看这里:http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.aspx

引用上面链接中黄色大框:

The ObjectContext class is not thread safe. The integrity of data objects in an ObjectContext cannot be ensured in multithreaded scenarios.

您可能需要考虑将 [ThreadStaticAttribute] 放在您的 _dbContext 字段上。

关于c# - 从具体化 'System.Guid' 类型到 'System.Int32' 类型的指定转换无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10542055/

相关文章:

c# - 实现显示下一张图片的方法

c# - 如何在 ASP.NET MVC2 中向 Controller 添加自定义 Hook

asp.net - WCF 如何作为数据源工作?

javascript - 对 WCF 服务的跨站点 ajax 调用

c# - 如何立即抛出 List<CustomExceptionObj> 异常

sql-server - 有效地为集合中的每个类别选择顶行

c# - 如何清除 WPF 中的 WebBrowser 控件

c# - 未将对象引用设置为对象的实例 C#

sql-server - SSIS 2008 - 如何将日期和时间字段添加在一起

sql - 将 X 个工作日添加到日期