繁体   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