2016-08-24 50 views
0

我有兩個一對一或一個關係的實體:VersionChangeLog。第二個存儲changelog文件(例如'ReadMe.html')。什麼是最好的方法來檢查實體框架中是否存在相關實體

public class Version 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public ChangeLog ChangeLog { get; set; } 
} 

public class ChangeLog 
{ 
    [Key] 
    public int Id { get; set; } 
    public string FileName { get; set; } 
    public byte[] File { get; set; } 

    public int VersionId { get; set; } 
    public Version Version { get; set; } 
} 

代碼一到一個關係:

modelBuilder.Entity<Version>() 
      .HasOne(v => v.ChangeLog) 
      .WithOne(c => c.Version) 
      .HasForeignKey<ChangeLog>(c => c.VersionId); 

如何檢查相關的實體存在。所以對於一對多的關係,我可以做這樣的事情Product.Versions.Any()。 一對一的情況如何?我應該使用上下文context.ChangeLogs.Any(c => c.VersionId == versionId)

+0

'Version.ChangeLog = null' –

+0

我應該加載在這種情況下相關的實體。如果可能的話,我想在服務器端檢查它。 –

+0

您認爲「服務器端」的作用是什麼?查詢該實體的DB並返回實體或空結果集。 –

回答

0

您可以通過執行以下操作做到這一點:

  1. 當您查詢的「Version」的實體,確保您還要求「ChangeLog」的實體,如下所示。

    var versionWithChangeLog = context.Versions.Include(v => v.ChangeLog) 
                .FirstOrDefault(v => v.Id == versionid); 
    
  2. 這保證了EF總是試圖拉動相關ChangeLog實體爲Version實體。

  3. 現在對相關的ChangeLog實體進行空檢查。

    if (versionWithChangeLog && versionWithChangeLog.ChangeLog != null) 
    { 
        // we got a version entity with a changelog. 
    } 
    

基本上如果有相關的記錄,EF會一直把它,因爲我們要求它。如果它是空的,這意味着數據庫沒有記錄。

喔,如果你想只檢查相關的changelog實體的存在與否,並不能恢復,您可以使用這些:

var versionsWithChangeLog = context.Versions.Where(v => v.ChangeLog != null); 

var versionsWithoutChangeLog = context.Versions.Where(v => v.ChangeLog == null); 
+0

我認爲這是一項昂貴的操作。我可以在那裏存儲大對象。 –

+0

@SergеуIsupov有道理。如果你只是想檢查它,你可以使用謂詞,而不是檢索實體。整個檢查位於SQL引擎端,因此不應該爲ChangeLog檢索數據。 –

相關問題