C# 上下文不将实体映射到父对象

C# 上下文不将实体映射到父对象,c#,.net-core,entity-framework-core,C#,.net Core,Entity Framework Core,我试图使用EF-Core显示数据库中的一些数据。提供的数据已使用EF core插入数据库,并按预期工作。 我想使用EF-core输出带有相关电话和电子邮件的人的JSON,但只得到没有电话和电子邮件的JSON 以下是我的实体: public class Person { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; se

我试图使用
EF-Core
显示数据库中的一些数据。提供的数据已使用
EF core
插入数据库,并按预期工作。 我想使用
EF-core
输出带有相关电话和电子邮件的人的JSON,但只得到没有电话和电子邮件的JSON

以下是我的实体:

    public class Person
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }
        public enum Geschlecht
        {
            U = 0,
            W = 1,
            M = 2
        }
        [MaxLength(255)]
        public string TitelVor { get; set; }
        [Required]
        [MaxLength(255)]
        public string Name { get; set; }
        [Required]
        [MaxLength(255)]
        public string Vorname { get; set; }
        [MaxLength(255)]
        public string TitelNach { get; set; }
        [MaxLength(255)]
        public string Zusatz { get; set; }
        public DateTime Geburtsdatum { get; set; }
        public string Notiz { get; set; }
        public List<EMail> EMails { get; set; } = new List<EMail>();
        public List<Telefon> Telefone { get; set; } = new List<Telefon>();
    }
    public class Telefon
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }
        [Required]
        [ForeignKey("AdresstypId")]
        public Adresstyp Adresstyp { get; set; }
        public int AdresstypId { get; set; }
        [ForeignKey("TelefontypId")]
        public Telefontyp Telefontyp { get; set; }
        public int TelefontypId { get; set; }
        [Required]
        [MaxLength(10)]
        public string Vorwahl { get; set; }
        [Required]
        [MaxLength(20)]
        public string Nummer { get; set; }
        [Required]
        [MaxLength(20)]
        public string Durchwahl { get; set; }
        [Required]
        public bool Primär { get; set; }
        [Required]
        [ForeignKey("PersonId")]
        public Person Person { get; set; }
        public int PersonId { get; set; }
    }
    public class EMail
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }
        [Required]
        [ForeignKey("AdresstypId")]
        public Adresstyp Adresstyp { get; set; }
        public int AdresstypId { get; set; }
        [Required]
        [MaxLength(255)]
        public string Mail { get; set; }
        [Required]
        public bool Primär { get; set; }
        [Required]
        [ForeignKey("PersonId")]
        public Person Person { get; set; }
        public int PersonId { get; set; }
    }
我正在使用
Postman
显示API的结果,并在调用方法“GetAllPersons”时得到以下结果:

正如你所看到的,
telefone和电子邮件都是空的。
我做错了什么?

您可以在查询中使用
Include()
,让EF知道您对it感兴趣,并带来相关实体。比如:

adressverwaltungContext.Persons.Include('Email').Include('Telefon')
您可能需要首先在Personen
DbSet
上调用
AsQueryable()
,以获得
Include
扩展方法

EF默认不检索电子邮件和Telefon的原因是,它认为这些不是个人“拥有”的,而是与个人有关系的独立实体,您可能并不总是对检索所有这些相关实体感兴趣

相反,您可以让EF知道这些是Person的逻辑部分,应该作为一个单元来处理。您可以通过从Email和Telefon中删除Person导航属性并在model builder中使用
OwnsMany()
来实现这一点。

您可以在查询中使用
Include()
,让EF知道您也对相关实体感兴趣。比如:

adressverwaltungContext.Persons.Include('Email').Include('Telefon')
您可能需要首先在Personen
DbSet
上调用
AsQueryable()
,以获得
Include
扩展方法

EF默认不检索电子邮件和Telefon的原因是,它认为这些不是个人“拥有”的,而是与个人有关系的独立实体,您可能并不总是对检索所有这些相关实体感兴趣


相反,您可以让EF知道这些是Person的逻辑部分,应该作为一个单元来处理。您可以通过从Email和Telefon中删除Person导航属性并在model builder中使用
OwnsMany()
来实现此目的。

Json方法的作用是什么?这是Microsoft.AspNetcore.Mvc中的内置方法:创建一个Microsoft.AspNetcore.Mvc.JsonResult对象,将指定的数据对象序列化为Json.so,您应该查看是否有Json方法的设置。问题似乎出在ListJSON方法上。这里的问题不是Json方法,中断返回并检查AddressVerWaltungContext。输出前的Personen对象表明,在将对象传递给Json方法之前,telefone和emails是空的。您的描述不清楚。因此,json部分无法描述问题。json方法的作用是什么?这是Microsoft.AspNetcore.Mvc中的内置方法:创建一个Microsoft.AspNetcore.Mvc.JsonResult对象,将指定的数据对象序列化为json。因此,您应该查看是否存在json方法的设置。问题似乎出在ListJSON方法上。这里的问题不是Json方法,中断返回并检查AddressVerWaltungContext。输出前的Personen对象表明,在将对象传递给Json方法之前,telefone和emails是空的。您的描述不清楚。所以json部分对描述问题是无用的。我无法让ASQueryable/Include工作,但是OwnsMany工作得很好,这似乎是对我来说更好的解决方案。非常感谢你!是的
OwnsMany
更符合您的模型,因为它实际上是一种所有权关系。很高兴它起作用了,你很好。我无法让ASQueryable/Include工作,但OwnsMany工作得很好,这似乎是更好的解决方案。非常感谢你!是的
OwnsMany
更符合您的模型,因为它实际上是一种所有权关系。很高兴它起作用了不客气
[
    {
        "id": 3,
        "titelVor": "test",
        "name": "name",
        "vorname": "vorname",
        "titelNach": "titelnach",
        "zusatz": "zusatz",
        "geburtsdatum": "1990-01-01T00:00:00",
        "notiz": "test",
        "eMails": [],
        "telefone": []
    }
]
adressverwaltungContext.Persons.Include('Email').Include('Telefon')