使用AutoMapper EF Core映射具有(一对一)引用另一个POCO类的POCO类

时间:2018-06-22 11:29:45

标签: entity-framework asp.net-core automapper

我很抱歉(可能)未在标题和此帖子中使用正确的术语。 问题如下: 我有一个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)呢?

0 个答案:

没有答案