对列类型感到困惑

本文关键字:类型 | 更新日期: 2023-09-27 17:58:15

我有一个从数据库生成的实体框架模型。其中一个实体是具有"Type"int属性的"Session"。

自动生成类:

public class Session
{
    int Type { get; set;}    
}

Edmx:

<EntityType Name="Sessions">
      <Property Name="Type" Type="int" Nullable="false" />
</EntityType>

有时在加载数据库值时,我会遇到一个异常,说它无法将"Type"属性(为int)设置为"string"值:

System.InvalidOperationException:"Session"的"Type"属性未能设置为"System.String"值。必须在System.Data.Entity.Core.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader 1.GetValue(DbDataReader reader, Int32 ordinal) at System.Data.Entity.Core.Common.Internal.Materialization.Shaper.GetPropertyValueWithErrorHandling[TProperty](Int32 ordinal, String propertyName, String typeName) at lambda_method(Closure , Shaper ) at System.Data.Entity.Core.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly[TEntity](Func 2 constructEntityDelegate、EntityKey EntityKey、,EntitySet EntitySet)在System.Data.Entity.Core.Common.Internal.Materialization.Cordinator 1.ReadNextElement(Shaper shaper) at System.Data.Entity.Core.Common.Internal.Materialization.Shaper 1.SimpleEnumerator.MoveNext()在System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable 1 source) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable 1 source)的lambda_method(Closure,Shaper)处

这是失败的查询:

var session = db.Sessions.Include("Game.Mod").Where(s => s.UniqueId == message.SessionUid && s.DomainId == this.DomainId && s.Game.UniqueId == message.GameUid).FirstOrDefault();

在本地调试时,一切正常。这是在部署到prod.时发生的

我目前在sql azure上使用EF 6.1,我认为这可能与升级有关,我认为以前(使用6.1)没有发生过这种情况。但我可能错了。

数据库列也是int(100%确认),映射正确。

对列类型感到困惑

错误消息的第一部分

System.InvalidOperationException:"Session"的"Type"属性未能设置为"System.String"值。

第一句话意味着在某个时刻尝试从intstring的转换。不过,您的数据库字段和属性是ints。我相信你,但EF试图转换。

尝试将查询保存到一个变量中,然后在另一行执行FirstOrDefault()

var query = db.Sessions.Include("Game.Mod").Where(s => s.UniqueId == message.SessionUid && s.DomainId == this.DomainId && s.Game.UniqueId == message.GameUid);
var session = query.FirstOrDefault();

然后尝试将执行查询之前生成的SQL保存到数据库中。这可能会给你一个线索。

错误消息的第二部分

您必须将其设置为"System.Int32"类型的非null值

为了解决您的问题,.Net建议您将变量设置为非null值。这是因为数据库中不允许使用null值。。。

您是否尝试将字段设置为nullable

不要忘记检查您是否在数据库和代码中进行了更改。


其他"可能"有用的见解

此外,我很想冒险说,你在生产中面临问题,但不是在本地,因为你有不同的数据。不要忘记,在尝试对数据执行某些操作时会发生运行时异常。