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')
您可能需要首先在PersonenDbSet
上调用AsQueryable()
,以获得Include
扩展方法
EF默认不检索电子邮件和Telefon的原因是,它认为这些不是个人“拥有”的,而是与个人有关系的独立实体,您可能并不总是对检索所有这些相关实体感兴趣
相反,您可以让EF知道这些是Person的逻辑部分,应该作为一个单元来处理。您可以通过从Email和Telefon中删除Person导航属性并在model builder中使用OwnsMany()
来实现这一点。您可以在查询中使用Include()
,让EF知道您也对相关实体感兴趣。比如:
adressverwaltungContext.Persons.Include('Email').Include('Telefon')
您可能需要首先在PersonenDbSet
上调用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')