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

use*_*261 5 c# mapping entity-framework exception

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

"位置"上的"IsDeleted"属性无法设置为"System.Int32"值.必须将此属性设置为类型为"System.Boolean"的非null值.
System.Data.Entity.Cart.Eternal中的System.Data.Entity.Core.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader`1.GetValue(DbDataReader reader,Int32 ordinal)
处于System.Data.Materialization.Shaper.GetPropertyValueWithErrorHandling [TProperty] System.Data.Entity.Core上的System.Data.Entity.Core.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper) 中的
lambda_method(Closure,Shaper)
处的(Int32 ordinal,String propertyName,String typeName)
.
System.Linq.Enumerable.FirstOrDefault [TSource]中的Common.Internal.Materialization.Shaper`1.SimpleEnumerator.MoveNext()(IEnumerable`1 source)

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

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

'SysGroup'上的'Description'属性无法设置为'System.Boolean'值.您必须将此属性设置为类型为"System.Int32"的非null值.

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

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

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

var desc = SysInfoInstance.SysGroup.Description;
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Location类是基本的:

public class Location : 
    BaseEntity
{
    ...
    public virtual bool IsDeleted { get; set; }
}
public abstract class BaseEntity
{
    public virtual int Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

小智 0

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

没有其他理由将财产设为虚拟。导航属性被标记为虚拟以进行延迟加载,标量属性被标记为虚拟以进行更改跟踪。

IsDeleted 不需要 virtual 关键字

您可以按如下方式创建另一个属性,而不将其映射到您的数据库。但这应该是没有必要的。

public int Deleted { get; set; }

[System.ComponentModel.DataAnnotations.Schema.NotMapped]
public bool IsDeleted
{
    get { return Deleted == 1; }
    set { Deleted = value ? 1 : 0; }
}
Run Code Online (Sandbox Code Playgroud)