这应该相当容易,但我很挣扎。
我的情况如下: 我有一个表(商品)与另一个表(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列(CommodityID
,CommodityMaterialID
,SpecficWeight
)
任何人都知道我做错了什么?
解
好的,我有点惭愧,问题是我在我的DataContract
POCO类中使用了Commodity
注释,在上面的代码中忽略了{{1} }引用缺少OmsCommodityMaterial
属性,因此使其字段不可见...
答案 0 :(得分:1)
虽然不是答案本身也许你会自己找到它here。
Include()/ThenInclude()
(急切加载)是三种可能的解决方案之一。我建议你探索其他两个 - 明确和懒惰。
编辑:进一步调查您的代码,以一对一的关系建立一组实体似乎有点奇怪。也许你只想使用类和(这很重要!)在调用HasOne()时在<
和>
中指定类名。如果你使用ReSharper或类似的东西,这样的工具建议简化名称,即在模板化流法时明确指定类型。当EF与已知的C#特征略有不同的含义时,这是下一个特殊的地方。第一个是众所周知的virtual
s。
HTH
答案 1 :(得分:0)
我对此感到有点惭愧,问题在于我在DataContract
POCO类中使用了Commodity
注释,在上面的代码中忽略了{{1} }引用缺少OmsCommodityMaterial
属性,因此使其字段不可见...