![](/img/trans.png)
[英]EF core + Automapper ID-only related entity collection, how?
[英]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; }
}
到目前為止,我所做的是簡單地從TblProduct
和TblProductTranslation
表中查詢實體,在 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.