如何在OneToMany关系中加载字段?

时间:2019-02-26 08:33:47

标签: c# .net-core asp.net-apicontroller

通过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="
    }
]

2 个答案:

答案 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