![](/img/trans.png)
[英]Entity Framework Core Invoke an Expression on Navigation property
[英]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.