![](/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.