檢查EntityFramework中是否存在相關實體的最佳方法是什麼

c# entity-framework entity-framework-core

我有兩個實體,一對一或零關係: 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)

熱門答案

您可以通過執行以下操作來執行此操作:

  1. 當您查詢“ Version ”實體時,請確保您還請求“ ChangeLog ”實體,如下所示。

    var versionWithChangeLog = context.Versions.Include(v => v.ChangeLog)
                                      .FirstOrDefault(v => v.Id == versionid);
    
  2. 這可確保EF始終嘗試為Version實體提取相關的ChangeLog實體。

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

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

基本上如果有相關記錄,EF將永遠拉它,因為我們要求它。如果它為null,則表示數據庫沒有記錄。

哦,如果你想檢查相關的更改日誌實體是否存在,而不是檢索它,你可以使用這些:

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

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


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow