繁体   English   中英

EF Core / AutoMapper - 当脚手架类中没有相应的集合时,如何 map 相关数据?

[英]EF Core / AutoMapper - How to map related data when there is no corresponding collection in the scaffolded classes?

我有一个 SQL 服务器数据库,其中使用自定义方法来允许存储不同语言的特定列的翻译。 它适用于仅包含实体实际数据的实体的“主”表,但不包含实体名称的列。 相反,有一个附加表仅用于实体名称的翻译。 该表由一个外键(实体 ID)、一个用于存储语言说明符(例如“en”或“fr”)的列和一个用于翻译名称的列组成。 这是一个例子:

  • 实体Product表(非常简化):

    ID 价格
    1 4
    2 1
  • 该实体的翻译表:

    product_id 产品名称
    1 布洛特
    1 zh 面包
    2 阿普菲尔
    2 zh 苹果

当我调用Scaffold-DbContext时,生成的类是这样的:

public partial class TblProduct
{
    public int Id { get; set; }
    public int Price { get; set; }
}

public partial class TblProductTranslation
{
    public int ProductId { get; set; }
    public int Price { get; set; }
    public string Language { get; set; }
    public string ProductName { get; set; }

    public virtual TblProduct Product { get; set; }
}

现在我想使用 AutoMapper 到 map 将两个表中的数据转换为这个 class 的对象:

public class Product
{
    public int ProductId { get; set; }
    public Dictionary<string, string> Name { get; }
    public int Price { get; set; }
}

到目前为止,我所做的是简单地从TblProductTblProductTranslation表中查询实体,在 foreach 循环中循环它们,然后手动添加名称翻译,如下所示:

foreach (TblProduct dbProduct in dbProducts)
{
    Product product = MapperBootstrapper.Instance.Map<Product>(dbProduct);
    dbTranslations.FindAll(translation => translation.ProductId == product.Id)
        .ForEach(
            translation => product.Name.Add(
                translation.Language,
                translation.ProductName
            )
        );
    products.Add(product);
}

有没有更好的方法来做到这一点,我不必手动合并两个表中的数据?

我只是检查了您的方案并使用了翻译列表而不是名称词典。 工作小提琴

    using System;
    using System.Collections.Generic;
    using System.Linq;
    public class Program
    {
        public static void Main()
        {
            List<TblProductTranslation> lst=new List<TblProductTranslation>();
            lst.Add(new TblProductTranslation{ProductId=1,Language="de",ProductName="Brot"});
            lst.Add(new TblProductTranslation{ProductId=1,Language="en",ProductName="Bread"});
            lst.Add(new TblProductTranslation{ProductId=2,Language="de",ProductName="Brot"});
            lst.Add(new TblProductTranslation{ProductId=2,Language="en",ProductName="Apple"});
        
           List<TblProduct> products=new List<TblProduct>();
           products.Add(new TblProduct {Id=1,Price=4});
           products.Add(new TblProduct {Id=2,Price=1});
        
           var result = (from c in products
              select new Product
              {
                  ProductId=c.Id,
                  Price=c.Price,
                 Name=lst.Where(x=>x.ProductId==c.Id).Select(y=>new Translation(){Language= y.Language,ProductName=y.ProductName}).ToList()
              }).ToList();
        
          foreach(var item in result)
          {
            foreach(var item1 in item.Name)
            {   
              Console.WriteLine("Id: {0} , Price: {1}, Name: {2}",item.ProductId,item.Price,item1.Language+" - "+item1.ProductName);
            }
          }
    }
    public class TblProductTranslation
    {
      public int ProductId { get; set; }
      public int Price { get; set; }
      public string Language { get; set; }
      public string ProductName { get; set; }
    }
    public class TblProduct
    {
      public int Id { get; set; }
      public int Price { get; set; }
    }
    public class Product
    {
      public int ProductId { get; set; }
      public List<Translation> Name { get; set;}
      public int Price { get; set; }
    }
    public class Translation
    {
      public string Language { get; set; }
      public string ProductName { get; set; }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM