【问题标题】:Web api use ForeignKey return NULLWeb api 使用 ForeignKey 返回 NULL
【发布时间】:2021-06-11 22:31:03
【问题描述】:

我创建了一个简单的 web api 'get' 工作良好,但是当我尝试使用关系一对多一篇文章添加 ForeignKey 时,API 的结果带有文章:null,不返回描述文章为什么?

[
  {
    "id": 4,
    "title": "Fineco - Corporate Business Template",
    "creationDate": "2020-07-18T00:00:00",
    "updateDate": null,
    "images": null,
    "articleId": 3,
    "article": null
  },
]

// GET: api/Articles
        [HttpGet]
        public async Task<ActionResult<IEnumerable<Articles>>> GetArticles()
        {
            return await _context.Articles.ToListAsync();
        }

public partial class Articles
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public DateTime? CreationDate { get; set; }
        public DateTime? UpdateDate { get; set; }
        public string Images { get; set; }
        public int? ArticleId { get; set; }
        
        [ForeignKey(nameof(ArticleId))]
        //[InverseProperty(nameof(ArticlesBody.Articles))]
        public virtual ArticlesBody Article { get; set; }
    }


public partial class ArticlesBody
{
    public ArticlesBody()
    {
        Articles = new HashSet<Articles>();
    }

    public int Id { get; set; }
    public string Article { get; set; }

    public virtual ICollection<Articles> Articles { get; set; }
}

这是文章 DBContext 的一部分:

entity.Property(e => e.Images) .HasColumnName("图片") .HasMaxLength(50) .IsUnicode(false);

            entity.Property(e => e.Title)
                .HasColumnName("title")
                .HasMaxLength(50);

            entity.Property(e => e.UpdateDate)
                .HasColumnName("updateDate")
                .HasColumnType("datetime");

            entity.HasOne(d => d.Article)
                .WithMany(p => p.Articles)
                .HasForeignKey(d => d.ArticleId)
                .HasConstraintName("FK_Articles_ArticlesBody");

        

【问题讨论】:

    标签: c# asp.net sql-server entity-framework


    【解决方案1】:

    EF Core 不会自动加载导航属性,而是提供 3 个选项来加载导航属性。 Loading Related Data

    在这种情况下,我将使用 Eager 加载方法并为您希望返回的导航属性指定 inlcudes。像这样

    [HttpGet]
    public async Task<ActionResult<IEnumerable<Articles>>> GetArticles()
    {
        return await _context.Articles.Include(e => e.Article).ToListAsync();
    }
    

    【讨论】:

    • 感谢 @verbedr 工作得很好,但我还有另一个问题,我想从 onetomany 更改为 OneToOne,但我在 modelBuilder 上有一些错误,我将 .WithMany 更改为 WithOne 并删除 ArticlesBody 上的集合,但没有不行,你知道 OneToOne 是如何改变的吗?谢谢
    • 查看docs.microsoft.com/en-us/ef/core/modeling/…。简而言之,您使用 WithOne。但是您需要了解主体和依赖对象。问题是您需要指示 EF Core FK 属性将驻留在哪个实体中并且需要最后创建。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多