我有一个从数据库生成的实体框架模型。其中一个实体是会话'用' Type' int property。
自动生成的课程:
public class Session
{
int Type { get; set;}
}
EDMX:
<EntityType Name="Sessions">
<Property Name="Type" Type="int" Nullable="false" />
</EntityType>
有时在加载数据库值时,我会收到一个例外情况,说它无法设置&#39; Type&#39;属性(即int)到一个&#39;字符串&#39;值:
System.InvalidOperationException:&#39; Type&#39;会议&#39;会议&#39;无法设置为System.String&#39;值。您必须将此属性设置为类型为&#39; System.Int32&#39;的非空值。 at 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的lambda_method(Closure,Shaper)。 Internal.Materialization.Coordinator1.ReadNextElement(Shaper shaper) at System.Data.Entity.Core.Common.Internal.Materialization.Shaper
1.SimpleEnumerator.MoveNext()在System.Linq.Enumerable.FirstOrDefault [TSource](IEnumerable1 source) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable
1 source)
这是失败的查询:
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%确认),映射是正确的。
答案 0 :(得分:5)
System.InvalidOperationException:&#39; Type&#39;会议&#39;会议&#39; 无法设置为System.String&#39;值。
第一句话暗示在int
到string
的某个时间点尝试转换。您的数据库字段和属性是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。这可能会给你一个线索。
您必须将此值设置为&#39; System.Int32&#39;
类型的非空值
要解决您的问题,。Net建议您将变量设置为非空值。这是因为数据库中不允许使用空值...
您是否尝试将字段设为nullable
?
不要忘记检查您是否在数据库和代码中进行了更改。
此外,我很想冒险说您在生产中遇到问题但在本地没有,因为您有不同的数据。不要忘记在尝试对数据执行某些操作时会发生运行时异常。