我很抱歉(可能)未在标题和此帖子中使用正确的术语。 问题如下: 我有一个POCO类,该类具有对另一个表的引用(只读)。该表与另一个表具有一对一的关系。
我将这个upo设置如下:
public class Commodity
{
public Commodity()
{
}
public long CommodityID { get; set; }
public long CommodityMaterialID { get; set; }
public decimal? SpecficWeight { get; set; }
public OmsCommodityMaterial OmsCommodityMaterial { get; set; }
}
OmsCommodityMaterial
属性是被引用的表。这个被引用的表也是POCO类,它具有其他一些字段,并且返回了我自己的(商品)表,因此我可以与Fluent建立一对一的关系:
public class OmsCommodityMaterial : OmsBaseClass
{
public OmsCommodityMaterial()
{
}
public long? CommodityMaterialID { get; set; }
public long? CommodityID { get; set; }
public string Name { get; set; }
public long? SortOrder { get; set; }
public Commodity Commodity { get; set; }
}
流动剂(用于一对一关系)设置如下:
public class MyContext : IdentityDbContext<ApplicationUser>
{
public virtual DbSet<Commodity> Commodity { get; set; }
// Oms classes:
public virtual DbSet<OmsCommodityMaterial> OmsCommodityMaterial { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
}
public MyContext(DbContextOptions<MyContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
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);
});
}
}
在端点中,我想对所有值进行GET,这些值将返回我自己的表(Commodity)的特定字段和引用表的所有字段(OmsCommodityMaterial)。
为此,我创建了一个ViewModel(也因为我得到了这篇文章的ERR_CONNECTION_RESET returning Async including object child collections中的一个循环引用),其外观如下:
public class CommodityViewModel
{
public long CommodityID { get; set; }
public long CommodityMaterialID { get; set; }
public decimal? SpecficWeight { get; set; }
public OmsCommodityMaterial OmsCommodityMaterial { get; set; }
}
对于ViewModels
,我正在使用AutoMapper
,但实际上我不知道如何映射/返回上述ViewModel的列表。
更新
我最终通过在[JsonIgnore]
POCO类的public virtual Commodity Commodity { get; set; }
属性中添加了OmsCommodityMaterial
属性来消除了循环引用错误。现在,我可以获取所有需要的列值:
return await this.Context.Commodity
.Include(i => i.OmsCommodityMaterial)
.ToListAsync();
但是,我认为这不是要走的路。为此,应该创建一个ViewModel
来检索商品列和(其中一些)被引用的OmsCommodityMaterial
列而不会出现循环引用错误的更好的解决方案,但是如何(使用AutoMapper)呢?