.net 在EF Core中配置所拥有类型的导航

btxsgosb  于 2023-03-20  发布在  .NET
关注(0)|答案(1)|浏览(105)

问一个问题

我的目标是创建一个值对象作为拥有类型,并通过这个valueobject配置拥有者与另一个表的关系。
在我的例子中,我有一个Person,Person有一个PhoneNumber,PhoneNumber是一个string列和一个int列,其中int列是一个Country表的外键。
我希望我的Person看起来像这样

public class Person 
{
    public int Id { get; set; }
    public PhoneNumber Phone { get; set; }
}

我的Phone类是这样的:

public class PhoneNumber : ValueObject
{
    public Country Country { get; set; }
    public string Number { get; set; }
}

国家就是任何一张table。

public class Country
{
    public int Id { get; set; }
    public string Name { get; set; }
}

我已将Person配置为:

builder.OwnsOne(o => o.Phone, options =>
        {
            options.Property(p => p.Number).HasColumnName($"PhoneNumber");
            options.HasOne(x => x.Country)
                .WithMany()
                .HasForeignKey($"PhoneCountryId")
                .OnDelete(DeleteBehavior.NoAction)
                .IsRequired(true);
        
            options.Property($"PhoneCountryId")
                .HasColumnName($"PhoneCountryId");
        
            options.Property($"PhoneCountryId")
                .IsRequired()
                .HasDefaultValue(1);
        
            options.WithOwner();
        });

我在这里使用字符串配置Country的实际外键,因为我不想将它显式地放在我的类中。
所需的数据库结构为:
| 人|另一个标题|
| - ------|- ------|
| 身份证|整数|
| 电话国家/地区ID|整数(国家/地区FK)|
| 电话号码|弦|
| 国家|另一个标题|
| - ------|- ------|
| 身份证|整数|
| 姓名|弦|
当我尝试从“个人”(Person)表格中投影/选择此对象时,“国家/地区”(Country)导航未填充。
示例:

dbContext.Persons.Select(x => x.Country.Name);

如果我将options.Navigation(e => e.Country).AutoInclude();添加到我的配置中,它将被填充,但我需要使用.“AsNoTracking()”进行查询,否则我会收到以下错误:跟踪查询正尝试在其结果中投影没有相应所有者的拥有实体,但无法跟踪没有所有者的拥有实体。请在结果中包含所有者实体,或使用“AsNoTracking”使查询成为非跟踪查询。
这使我相信关系没有正确配置。它能够确定当我选择Person.Phone.Country时,我得到了正确的国家/地区,但似乎不是Person拥有的国家/地区?

包括提供程序和版本信息

EF核心版本:7.0.2数据库提供商:(例如,Microsoft.EntityFrameworkCore.SqlServer)目标框架:(例如.NET 7.0)操作系统:Linux集成开发环境:Rider

mrwjdhj3

mrwjdhj31#

错误实际上是由于Map器中的方法调用无法转换,而不是由于EF核心配置。

相关问题