问一个问题
我的目标是创建一个值对象作为拥有类型,并通过这个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
1条答案
按热度按时间mrwjdhj31#
错误实际上是由于Map器中的方法调用无法转换,而不是由于EF核心配置。