簡體   English   中英

Entity Framework Core 5 - 單一導航屬性

[英]Entity Framework Core 5 - Single Navigation Property

我正在使用 Entity Framework Core 5,但在檢索記錄及其所有相關數據時遇到問題。 正如您在下面看到的,我有三個班級; 個人、客戶和推薦人。 Client 和 ReferralPerson 都包含 Person 對象,Client 還包含一個 ReferralPerson object。

public class Person
{
    public int ID { get; set; }

    [Required, StringLength(50)]
    public string FirstName { get; set; } = "N/A";

    [Required, StringLength(50)]
    public string LastName { get; set; } = "N/A";

    [StringLength(30)]
    public string PhoneNumberPrimary { get; set; }

    [StringLength(30)]
    public string PhoneNumberSecondary { get; set; }

    [StringLength(50)]
    public string Address { get; set; }

    [StringLength(50)]
    public string EmailAddress { get; set; }

}

public class Client
{
    public int ID { get; set; }
    public Person Person { get; set; }

    [StringLength(50)]
    public string CommunicationMethod { get; set; }
    public DateTime InitalContactDate { get; set; }       

    [Required, StringLength(100)]
    public string ReasonForVisit { get; set; }
    public ReferralPerson ReferralPerson { get; set; }

}

public class ReferralPerson
{
    public int ID { get; set; }
    public Person Person { get; set; }

    [StringLength(100)]
    public string BusinessName { get; set; }
    public int NumberOfReferrals { get; set; }

}

我的 OnModelCreating() 方法目前如下所示:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    //setup our relationships
    modelBuilder.Entity<Client>()
        .HasOne(c => c.Person);

    modelBuilder.Entity<Client>()
        .HasOne(c => c.ReferralPerson);

    modelBuilder.Entity<Person>().ToTable("People");
    modelBuilder.Entity<ReferralPerson>().ToTable("ReferralContacts");

}

最后,我有一個用於搜索客戶端記錄的方法,如下所示:

public IEnumerable<Client> GetClientsByLastName(string lastName)
{
    var query = db.Clients
                  .Include(x => x.Person)
                  .Include(x => x.ReferralPerson)
                  .Where(x => string.IsNullOrEmpty(lastName) || 
                    x.Person.LastName.Contains(lastName))
                  .ToList();

    return query;
}

查看遷移創建的數據庫表,我可以看到 Clients 表、Person (People) 表和 ReferralContacts 表之間的關系似乎是正確的。 當我保存新記錄時,我還可以看到記錄被正確添加到這些表中。 問題在於檢索。 即使我在“GetClientsByLastName()”方法中使用“.Include(x => x.Person)”,檢索客戶記錄時也不會填充人員 object。 我花了很多時間查看其他帖子和解決方案以及 EF Core 文檔,但我仍然遺漏了一些東西。 任何幫助將不勝感激。

編輯 5-9-2022:

這是 EF 從上面顯示的 LINQ 查詢生成的 SQL 查詢

DECLARE @__lastName_0 nvarchar(50) = N'bur';
SELECT [c].[ID], 
[c].[CommunicationMethod], 
[c].[InitalContactDate], 
[c].[PersonID], 
[c].[ReasonForVisit],
[c].[ReferralPersonID],
[p].[ID],
[p].[Address],
[p].[EmailAddress],
[p].[FirstName],
[p].[LastName],
[p].[PhoneNumberPrimary],
[p].[PhoneNumberSecondary],
[r].[ID],
[r].[BusinessName],
[r].[NumberOfReferrals],
[r].[PersonID]
FROM [Clients] AS [c]
LEFT JOIN [People] AS [p] ON [c].[PersonID] = [p].[ID]
LEFT JOIN [ReferralContacts] AS [r] ON [c].[ReferralPersonID] = [r].[ID]
WHERE (@__lastName_0 LIKE N'') OR (CHARINDEX(@__lastName_0, [p].[LastName]) > 0)
ORDER BY [p].[LastName]

當我在 SSMS 中執行 SQL 查詢時,所有相關數據都按預期檢索,因此問題似乎不在查詢中。 問題在於數據是如何填充到底層對象中的。

長話短說,您正在設置您看到的這個空數據,如果您這樣做,EFC 不會覆蓋它。 注釋掉/刪除所有執行以下操作的實體構造函數:

    public Client()
    {
        Person = new Person(0, "", "");
        ContactType = new ContactType();
        ReferralPerson = new ReferralPerson();
        NewsletterOption = new NewsletterOption();
    }

如果制作的實體看起來像問題中出現的實體,則一切正常

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM