繁体   English   中英

EF代码首先,查询一个对象,对象的int属性始终为1?

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

首先,我的EF代码中有一个BuildingAudit类。 该审核与建筑物关联。 每个建筑物只能进行一次有效审核。 但是我通过类的修订列跟踪对审核的更改,这是一个非null整数。

每次我运行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>();
    }
}

此类继承的实体只有这样:

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。然而,当返回对象时,其修订版为1!

有人知道吗

这是一些图片,我必须裁剪以隐藏一些敏感信息,但这是通过上面粘贴的代码进行的一次调试:

在此处输入图片说明

这是从检查else语句中的修订值开始的,清楚地显示出返回选定建筑物的修订= 2的审核。 然后:

在此处输入图片说明

返回的对象属性的修订版为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);
        }

在此函数中,version是可以为null的int,但在POCO上是纯int。 将修订版本转换为普通的int会使此操作停止。 我正在检查它是否为null,并且在if中不会出现在该部分,但不确定为什么这会导致EF在没有通知任何错误的情况下中断。

如果revisionif (revision == null)是一个整数,将始终返回false,因为int是一个非空的类型

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM