在一对一的相关表中从FK表中获取相关列 - EF Core(2)

时间:2018-06-11 10:39:57

标签: entity-framework asp.net-core fluent ef-core-2.0

这应该相当容易,但我很挣扎。

我的情况如下: 我有一个表(商品)与另一个表(CommodityMaterial)的外键。在我的GET端点中,我想要检索Commodity中的所有列数据以及CommodityMaterial中的所有列。

我已将其设置如下:

    public class Commodity
    {
        public long CommodityID { get; set; }

        public long CommodityMaterialID { get; set; }

        public decimal? SpecficWeight { get; set; }

        public OmsCommodityMaterial OmsCommodityMaterial { get; set; }

        public ICollection<OmsCommodityMaterial> OmsCommodityMaterials { get; set; }
    }

外键表:

    public class CommodityMaterial 
    {
        public long? CommodityMaterialID { get; set; }

        public string Name { get; set; }

        public long? SortOrder { get; set; }

        public Commodity Commodity { get; set; }
    }

FLUENT API:

    modelBuilder.Entity<Commodity>(entity =>
            {
                entity.Property(e => e.CommodityID)
                    .HasColumnName("CommodityID")
                    .ValueGeneratedOnAdd();

                entity.Property(e => e.CommodityMaterialID)
                    .HasColumnName("CommodityMaterialID");

                entity.Property(e => e.SpecficWeight)
                    .HasColumnName("SpecficWeight")
                    .HasColumnType("decimal(18, 2)");

                entity.HasOne(a => a.OmsCommodityMaterial)
                    .WithOne(b => b.Commodity)
                    .HasForeignKey<Commodity>(b => b.CommodityMaterialID);
            });

这会创建正确的关系,创建商品时需要CommodityMaterial(ID)。

现在我想获取Commodity表的所有值/列,以及CommodityMaterial表(CommodityMaterialID, Name and SortOrder)的相关列。在阅读了一些其他帖子后我发现我应该/可以使用Include获取相关数据,我的GET操作如下:

    [HttpGet]
    public async Task<IEnumerable<Commodity>> GetTest()
    {
        return await Context.Commodity.Include(x => x.OmsCommodityMaterials).ToListAsync();
    }

但是,这仍然只返回商品表的3列(CommodityIDCommodityMaterialIDSpecficWeight

任何人都知道我做错了什么?

好的,我有点惭愧,问题是我在我的DataContract POCO类中使用了Commodity注释,在上面的代码中忽略了{{1} }引用缺少OmsCommodityMaterial属性,因此使其字段不可见...

2 个答案:

答案 0 :(得分:1)

虽然不是答案本身也许你会自己找到它here

Include()/ThenInclude()急切加载)是三种可能的解决方案之一。我建议你探索其他两个 - 明确懒惰

编辑:进一步调查您的代码,以一对一的关系建立一组实体似乎有点奇怪。也许你只想使用类和(这很重要!)在调用HasOne()时在<>中指定类名。如果你使用ReSharper或类似的东西,这样的工具建议简化名称,即在模板化流法时明确指定类型。当EF与已知的C#特征略有不同的含义时,这是下一个特殊的地方。第一个是众所周知的virtual s。

HTH

答案 1 :(得分:0)

我对此感到有点惭愧,问题在于我在DataContract POCO类中使用了Commodity注释,在上面的代码中忽略了{{1} }引用缺少OmsCommodityMaterial属性,因此使其字段不可见...