AutoMapper - 从链接源 table 中检索与链接源不同的字段
AutoMapper - Retrieve a different field from a linked source table than the one that links it
我有以下 table 结构,它混合了遗留字段和更新的架构:
Coaster
Id (Int)
ParkId (Int)
Park
Id (int)
UniqueId (Guid)
因此,Coaster 和 Park table 是使用 Park.Id 字段 linked 的。 UniqueId 字段当前未在旧架构中使用。我们正在使用 AutoMapper 迁移到干净的数据库,这个新模式如下所示:
Coaster
Id (Int)
ParkId (Guid)
Park
Id (Guid)
我遇到的问题是使用 AutoMapper 执行此操作。我一直在试验这段代码:
private ModelMapper()
{
Mapper.Initialize(x =>
{
x.AddProfile<ConvertersMappingProfile>();
});
}
// This is the part that I'm trying to work out
public ConvertersMappingProfile()
{
CreateMap<Park, NewSchema.Park>()
.ForMember(dst => dst.Id, map => map.MapFrom(src => src.ParkId));
}
在新架构中,Park table 的 ID 与旧架构的 UniqueId 匹配。
我的问题是:因为在旧模式中没有直接 link 到公园 table 的 UniqueId 值,我如何获取该值以映射到新模式使用Coaster.ParkId 字段到 Park.Id 字段映射?
我使用了自定义解决方案来解决问题。所以我创建了我的解析器,它提取数据库中的项目列表(通常很小)以从我需要的 table 中获取所有值,并检索值。 (Pre-refactored 代码):
public class ParkResolver : IValueResolver<Original.Park, New.Park, string> {
public string Resolve(Original.Park source, New.Park dest, string destMember, ResolutionContext context) {
List<Original.Park> list = new List<Original.Park>();
using (IDbConnection con = new SQLiteConnection(@"Data Source=C:\Users\Me\Documents\Parks.sql;")) {
con.Open();
list = con.Query<Original.Park>($"SELECT * FROM Parks WHERE Id = {source.ParkId}").ToList();
con.Close();
}
return list.FirstOrDefault().UniqueId;
}
}
我为正在映射的 table 调用我的自定义解析器:
CreateMap<Original.Park, New.Park>()
.ForMember(dst => dst.ParkId, map => map.MapFrom(new ParkResolver()));
希望这会对其他人有所帮助。
我有以下 table 结构,它混合了遗留字段和更新的架构:
Coaster
Id (Int)
ParkId (Int)
Park
Id (int)
UniqueId (Guid)
因此,Coaster 和 Park table 是使用 Park.Id 字段 linked 的。 UniqueId 字段当前未在旧架构中使用。我们正在使用 AutoMapper 迁移到干净的数据库,这个新模式如下所示:
Coaster
Id (Int)
ParkId (Guid)
Park
Id (Guid)
我遇到的问题是使用 AutoMapper 执行此操作。我一直在试验这段代码:
private ModelMapper()
{
Mapper.Initialize(x =>
{
x.AddProfile<ConvertersMappingProfile>();
});
}
// This is the part that I'm trying to work out
public ConvertersMappingProfile()
{
CreateMap<Park, NewSchema.Park>()
.ForMember(dst => dst.Id, map => map.MapFrom(src => src.ParkId));
}
在新架构中,Park table 的 ID 与旧架构的 UniqueId 匹配。
我的问题是:因为在旧模式中没有直接 link 到公园 table 的 UniqueId 值,我如何获取该值以映射到新模式使用Coaster.ParkId 字段到 Park.Id 字段映射?
我使用了自定义解决方案来解决问题。所以我创建了我的解析器,它提取数据库中的项目列表(通常很小)以从我需要的 table 中获取所有值,并检索值。 (Pre-refactored 代码):
public class ParkResolver : IValueResolver<Original.Park, New.Park, string> {
public string Resolve(Original.Park source, New.Park dest, string destMember, ResolutionContext context) {
List<Original.Park> list = new List<Original.Park>();
using (IDbConnection con = new SQLiteConnection(@"Data Source=C:\Users\Me\Documents\Parks.sql;")) {
con.Open();
list = con.Query<Original.Park>($"SELECT * FROM Parks WHERE Id = {source.ParkId}").ToList();
con.Close();
}
return list.FirstOrDefault().UniqueId;
}
}
我为正在映射的 table 调用我的自定义解析器:
CreateMap<Original.Park, New.Park>()
.ForMember(dst => dst.ParkId, map => map.MapFrom(new ParkResolver()));
希望这会对其他人有所帮助。