2015-09-30 48 views
0

我的EF代碼中有一個BuildingAudit類。該審計與建築物相關聯。每棟建築物只能有一次主動審計。但是,我通過類的修訂列來跟蹤對審計的更改,該列是非空整數。EF代碼首先,查詢對象,對象的int屬性始終爲1?

每次我運行一個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!

任何人有什麼想法?

這裏有一些照片,我不得不作物隱藏一些敏感信息,但他們是從通過上述粘貼代碼運行一個調試:

enter image description here

這從其他檢查修正值的聲明,清楚地顯示返回所選建築物的版本= 2的審覈。然後:

enter image description here

返回的對象屬性已修訂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); 
     } 

修訂在此函數可爲空的INT,但對POCO是普通int。將修訂版本轉換爲純粹的int使得停止發生。我正在檢查它是否爲空,並且它永遠不會出現在if中的這一部分,但不知道爲什麼這會導致EF在沒有通知任何錯誤的情況下中斷。

+0

我無法從你的POCO知道你的PK在你的BuildingAudit表上。我想知道如果EF也不能,並因此而錯誤地填充對象。 – Tim

+0

它只是一個從實體繼承的ID屬性,我的所有對象都有。 – SventoryMang

+0

也只是爲了澄清,表本身具有正確的ID屬性作爲PK。修訂只是一個簡單的專欄。 – SventoryMang

回答

0

如果revisionif (revision == null)是一個整數,將始終返回false,因爲int是一個非空類型

如果要啓用空校驗使用int?爲類型

編輯: 確保BuildingAudit.Revision的類型與您檢查的版本值相同。看來EF的解析器會進行全面檢查,這將是Nullable<int>int

+0

修正版是一個可爲空的int,整數的默認值爲1而不是0.我並不是抱怨它總是返回false,因爲它不是。然而,你的評論讓我能夠找出答案,對象本身的修訂是int。所以我會標記你。儘管如此,編輯你的回答真正的答案。 – SventoryMang