簡體   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