通过APIController加载时如何加载OnetoMany字段。
我有一个Article模型
public class Article : BaseEntity
{
public string Title
{
get; set;
}
public Edition Edition
{
get; set;
}
}
还有一个Edition模型
public class Edition : BaseEntity
{
public string Title
{
get; set;
}
public int Position { get; set; }
}
BaseEntity模型如下:
public class BaseEntity
{
public Guid ID { get; set; }
[Timestamp]
public byte[] Timestamp { get; set; }
public BaseEntity()
{
ID = Guid.NewGuid();
}
}
我在Articles Controller中定义了一个HttpGet函数,我想在其中加载所有文章。
[HttpGet]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesDefaultResponseType]
public ActionResult<IEnumerable<Article>> GetArticles([FromRoute] Guid editionId)
{
return Ok(_context.Articles);
}
不幸的是,EditionId没有与其他字段一起加载。 JSON如下所示:
[
{
"title": "Article Postman",
"edition": null,
"id": "74b53ba7-75a4-46c6-a70f-470e73c83ee5",
"timestamp": "AAAAAAAAB+M="
},
{
"title": "Title",
"edition": null,
"id": "d74b4ac3-7ddc-4c89-bd74-4fbe3fbe0cd8",
"timestamp": "AAAAAAAAB+E="
},
{
"title": "Article Postman 2",
"edition": null,
"id": "5dddd99f-151a-4325-91f7-c8295b872410",
"timestamp": "AAAAAAAAB+U="
}
]
答案 0 :(得分:2)
只需将property
的{{1}}虚拟化:
Lazy Loading
但是,请看一下Lazy Loading vs Eager Loading。,看哪一个适合您的情况。
如果您使用的是延迟加载,请检查public virtual Edition Edition
{
get; set;
}
的{{1}}中是否包含以下语句:
Constructor
只要在正确的地方使用,延迟加载是EF中的一个不错的选择,因为对于每个对象,为了获取其关系,EF都会创建到数据库的新连接。
另一方面,急切加载(Include())在第一个连接中加载列表的所有相关对象,其中许多您可能不会使用。
根据要提取的对象数,您应该在“延迟加载”和“紧急加载”之间进行选择。
答案 1 :(得分:2)
我建议您使用EF Core提供的简单解决方案,即每次您调用数据访问层以添加指定的数据时都添加.Include(x => x.ReferenceIWantToLoad)。 这样可以避免在项目模型中进行任何重组,以在每个外部引用中添加关键字“虚拟”,例如:
JavaScriptComponentState
PS:为了能够忽略引用的无限循环,您要将其添加到启动文件配置中:
Div