EF 代码首先,查询一个对象,对象上的 int 属性 总是 1?

EF Code First, Querying an object, int property on object is always 1?

首先我的 EF 代码中有一个 BuildingAudit class。此审计与建筑物相关联。每栋建筑只能进行一次活动审核。但我通过 class 上的修订列跟踪审计的更改,这是一个非空整数。

每次我 运行 一个 EF 查询。修订总是返回为 1,即使我的查询包含修订检查是否等于 1 以外的值也是如此。我不明白。映射中没有任何东西会导致这种情况,POCO 中没有任何东西会在查询后覆盖该值。怎么会这样?

这是我的代码:

BuildingAudit buildingAudit = null;
        if (revision == null)
        {
            buildingAudit = _buildingAuditService.CustomQuery().Where(x => x.BuildingId == selectedBuilding.Id).OrderByDescending(x => x.Revision).FirstOrDefault();
        }
        else
        {
            buildingAudit = _buildingAuditService.CustomQuery().FirstOrDefault(x => x.BuildingId == selectedBuilding.Id && x.Revision == revision);
        }

对于那些想知道 CustomQuery() 只是一般性地将 EF Context.Set 公开为可查询的人:

public virtual IQueryable<TClass> Query()
    {
        return Context.Set<TClass>().AsQueryable();
    }

还有我的POCO:

 public class BuildingAudit : Entity
{
    public Guid BuildingId { get; set; }
    public virtual Building Building { get; set; }

    public virtual ICollection<AuditCategory> AuditCategories { get; set; }

    public Guid Auditor { get; set; }
    public virtual User Auditor { get; set; }

    public bool IsComplete { get; set; }
    public int Revision { get; set; }

    public BuildingAudit()
    {
        InitializeCollections();
    }

    private void InitializeCollections()
    {
        AuditCategories = new Collection<AuditCategory>();
    }
}

这个 class 继承的实体只有这个:

public abstract class Entity
{
    public Guid Id { get; set; }
    public DateTime DateCreated { get; set; }
    public DateTime DateModified { get; set; }
    public string CreatedBy { get; set; }
    public string LastModifiedBy { get; set; }
    public bool Active { get; set; }
}

所以没有什么奇怪的。然而,每次我调试此查询时,它都会转到 else 语句,即 .Where 中提供的修订版本不是 1,例如 2。然而,当对象被 returned 时,它的修订版本为 1!

有人知道吗?

这里有一些图片,我不得不裁剪以隐藏一些敏感信息,但它们来自一个调试 运行 通过上面粘贴的代码:

这是通过检查 else 语句中的修订值,清楚地向 return 审计显示所选建筑物的修订值 = 2。那么:

returned 对象 属性 有修订版 1...还应该注意的是,我可以保存 1 以外的值并且数据库正确反映了这一点,但我似乎不能查询 1 以外的任何内容。

答案:

if (revision == null)
        {
            assessment = _hazardAssessmentService.CustomQuery().Where(x => x.LaboratoryId == selectedLab.Id).OrderByDescending(x => x.Revision).FirstOrDefault();
        }
        else
        {
            int rev = (int) revision;
            assessment = _hazardAssessmentService.CustomQuery().FirstOrDefault(x => x.LaboratoryId == selectedLab.Id && x.Revision == rev);
        }

revision 在这个函数中是 nullable int,但在 POCO 上是一个普通的 int。将 revision 转换为普通 int 使这种情况停止发生。我正在检查它是否为 null,它永远不会出现在 if 的这一部分,但不确定为什么这会导致 EF 在不通知任何错误的情况下中断。

如果 if (revision == null) 处的 revision 是整数,它将始终 return false 因为 int 是不可空类型

如果要启用空检查,请使用 int? 作为类型

编辑: 确保 BuildingAudit.Revision 的类型与您检查的修订值相同。似乎 EF 的解析器进行了完整的类型检查,即 Nullable<int>int