![](/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.