gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 07:59:06 25 4
gpt4 key购买 nike

从物化“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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com