如何对多对多字段使用急切加载?

时间:2019-03-06 11:10:06

标签: .net-core many-to-many

我有一个带有ArticleAuthors字段的文章模型:

public virtual ICollection<ArticleAuthor> ArticleAuthors
{
    get; set;
}

我的ArticleAuthor类看起来像这样

public class ArticleAuthor : BaseEntity
{
    public Guid ArticleId { get; set; }

    public Article Article { get; set; }

    public Guid AuthorId { get; set; }

    public Author Author { get; set; }
}

作者类

public class Author : BaseEntity
{
    public string Name { get; set; }

    public string Email { get; set; }

    public ICollection<ArticleAuthor> ArticleAuthors { get; set; }
}

和BaseEntity

public class BaseEntity
{
    public Guid ID { get; set; }

    [Timestamp]
    public byte[] Timestamp { get; set; }

    public BaseEntity()
    {
        ID = Guid.NewGuid();
    }
}

使用Fluent API定义了多对多关系

modelBuilder.Entity<ArticleAuthor>()
    .HasKey(bc => new {bc.ArticleId, bc.AuthorId});
modelBuilder.Entity<ArticleAuthor>()
    .HasOne(bc => bc.Article)
    .WithMany(b => b.ArticleAuthors)
    .HasForeignKey(bc => bc.ArticleId);
modelBuilder.Entity<ArticleAuthor>()
    .HasOne(bc => bc.Author)
    .WithMany(c => c.ArticleAuthors)
    .HasForeignKey(bc => bc.AuthorId);

我定义了一个Web服务来加载文章

[HttpGet("{id}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesDefaultResponseType]
public async Task<ActionResult<Article>> GetArticle([FromRoute] Guid id)
{
    Article article = await _dbContext.Articles
        .Include(x => x.MainPictureFile)
        .FirstOrDefaultAsync(x => x.ID == id);

    if (article == null)
    {
        return NoContent();
    }

    return Ok(article);
}

它非常有效,直到我尝试使用EagerLoading加载ArticleAuthors字段

[HttpGet("{id}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesDefaultResponseType]
public async Task<ActionResult<Article>> GetArticle([FromRoute] Guid id)
{
    Article article = await _dbContext.Articles
        .Include(x => x.MainPictureFile)
        .Include(x => x.ArticleAuthors)
        .FirstOrDefaultAsync(x => x.ID == id);

    if (article == null)
    {
        return NoContent();
    }

    return Ok(article);
}

当我这样做时,返回的JSON在 articleId 之后被截断:

{"title":"Editorial updated","chapo":null,"body":null,"readingTime":null,"edition":null,"date":null,"theme":null,"articleAuthors":[{"articleId":"d4ef0cfe-0b7b-4432-a099-75a221c2258b"

我使用本文来配置我的多对多关系:https://www.learnentityframeworkcore.com/configuration/many-to-many-relationship-configuration

0 个答案:

没有答案