EF随机查看错误的属性类型

时间:2016-01-26 09:57:26

标签: c# entity-framework exception mapping

我们首先使用EF 6.1.3和SimpleInjector 3.1.0使用EF代码,然后我们随机获得与此类似的异常:

  

' IsDeleted'物业位置'无法设置为System.Int32'值。您必须将此属性设置为类型为' System.Boolean'的非空值   在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)
  在lambda_method(Closure,Shaper)
  at System.Data.Entity.Core.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper)
  在System.Data.Entity.Core.Common.Internal.Materialization.Shaper`1.SimpleEnumerator.MoveNext()
  在System.Linq.Enumerable.FirstOrDefault [TSource](IEnumerable`1 source)

在这种情况下,Location表的IsDeleted列是bit / not null。而Location实体上的Property绝对是一个不可为空的布尔值。我已经检查了我们的git存储库中实体的整个历史记录,这个属性从来就不是布尔值,并且服务器上的当前dll是正确的,所以问题不在于由错误的代码/ dll引起。

真正奇怪的是,大部分时间我们的网站工作正常,我希望每次都会发生异常。我们已经看到同样类型的错误出现在其他3个实体上(也看似随机)。在每种情况下,它都是不同的属性和数据类型。 例如:

  

'说明'物业在' SysGroup'无法设置为System.Boolean'值。您必须将此属性设置为类型为' System.Int32'的非空值。

     

' SysGroupId' SysInfo'上的财产无法设置为System.String'值。您必须将此属性设置为类型为' System.Int32'的非空值。

     

' Id'属于' BaseEntity'无法设置为System.Guid'值。您必须将此属性设置为类型为' System.Int32'的非空值。

关于最后一个......我们从BaseEntity继承的每个实体都有一个名为' Id'的非可空int属性。我们也不会在任何地方使用任何Guid。因此,如果BaseEntity确实使用了ID属性的Guid,那么每个查询都会失败。最后一个异常发生在代码导航属性时,如下所示:

var desc = SysInfoInstance.SysGroup.Description;

有什么想法吗?

“位置”类基本上是:

public class Location : 
    BaseEntity
{
    ...
    public virtual bool IsDeleted { get; set; }
}
public abstract class BaseEntity
{
    public virtual int Id { get; set; }
}

2 个答案:

答案 0 :(得分:0)

我不确定为什么你的IsDeleted属性被标记为虚拟。

没有其他理由让属性成为虚拟。对于延迟加载,导航属性被标记为虚拟,而标量属性被标记为虚拟以进行更改跟踪。

IsDeleted不需要虚拟关键字

您可以按如下方式创建另一个属性,而不是将其映射到您的db。但这不是必要的。

public int Deleted { get; set; }

[System.ComponentModel.DataAnnotations.Schema.NotMapped]
public bool IsDeleted
{
    get { return Deleted == 1; }
    set { Deleted = value ? 1 : 0; }
}

答案 1 :(得分:0)

有同样的问题。看起来像某种类型的EF错误连接到存储过程。您在应用程序中使用它们吗?

在我的情况下,问题是,我已经更改了数据库中表的结构(将列添加到中间),而存储过程(从该数据库获取数据)已经添加到EF中。之后,每次尝试调用存储过程时,都会出现相同的异常。异常看起来很奇怪,我浪费了很多时间来找出问题所在。

解决方案是将新列移动到表的末尾。它修复了所有问题。看起来EF的存储过程以某种方式保存了数据的结构,并且当表结构发生更改时,它会引发非常奇怪和错误的异常。

另一种解决方案是从EF中删除存储过程,然后放回原处。