ASP.NET C# 如何将源 ID 映射到目标对象
ASP.NET C# How to map a source Id to a Destionation object
我对自动映射器很陌生,我正在尝试将我的 DTO 对象映射到应该保存在数据库中的实体。这是我的示例代码:
public class SourceObject {
public int Id {get; set;}
public string Description {get; set;}
public int StatusId {get; set;}
}
public class DestinationObject {
public int Id {get; set;}
public string Description {get; set;}
public DestinationStatus Status {get; set;}
}
public DestinationStatus {
public int Id {get; set;}
public string Description {get; set;}
}
我如何为 AutoMapper 定义映射配置文件 class,将 SourceObject 的输入 StatusId 属性(简单类型)映射到 DestinationObject 的 DestinationStatus 属性(对象)?
非常感谢您。
你不能。您在这里可以做的最好的事情是为 Status
引用添加一个外键 属性,这样您就可以将键映射到键。 EF 将在您保存时自动对引用执行对象修复。
如果您不能或不愿这样做,那么您唯一的选择就是自定义值解析器,这可能非常低效。本质上,您需要告诉 AutoMapper,为了将 id 映射到 reference prop,它需要使用您的自定义解析器。然后,该自定义解析器将获取 id 并使用它来查询数据库中的对象,然后 return 对象。如果您正在映射事物列表,这将导致 N 个查询,一个用于列表中的每个项目(因此它效率低下且不推荐)。另请注意,查询必须是同步的,而不是异步的,因为 AutoMapper API 不支持异步操作。这可能会在某些情况下导致阻塞问题。
public class StatusResolver : IValueResolver<SourceObject, DestinationObject, DestinationStatus>
{
private readonly MyContext _context;
public StatusResolver(MyContext context)
{
_context = context;
}
public DestinationStatus Resolve(SourceObject source, DestinationObject destination, int member, ResolutionContext context)
{
return _context.DestinationStatuses.Find(source.StatusId);
}
}
然后
.ForMember(dest => dest.Status, opts => opts.MapFrom<StatusResolver>())
我对自动映射器很陌生,我正在尝试将我的 DTO 对象映射到应该保存在数据库中的实体。这是我的示例代码:
public class SourceObject {
public int Id {get; set;}
public string Description {get; set;}
public int StatusId {get; set;}
}
public class DestinationObject {
public int Id {get; set;}
public string Description {get; set;}
public DestinationStatus Status {get; set;}
}
public DestinationStatus {
public int Id {get; set;}
public string Description {get; set;}
}
我如何为 AutoMapper 定义映射配置文件 class,将 SourceObject 的输入 StatusId 属性(简单类型)映射到 DestinationObject 的 DestinationStatus 属性(对象)? 非常感谢您。
你不能。您在这里可以做的最好的事情是为 Status
引用添加一个外键 属性,这样您就可以将键映射到键。 EF 将在您保存时自动对引用执行对象修复。
如果您不能或不愿这样做,那么您唯一的选择就是自定义值解析器,这可能非常低效。本质上,您需要告诉 AutoMapper,为了将 id 映射到 reference prop,它需要使用您的自定义解析器。然后,该自定义解析器将获取 id 并使用它来查询数据库中的对象,然后 return 对象。如果您正在映射事物列表,这将导致 N 个查询,一个用于列表中的每个项目(因此它效率低下且不推荐)。另请注意,查询必须是同步的,而不是异步的,因为 AutoMapper API 不支持异步操作。这可能会在某些情况下导致阻塞问题。
public class StatusResolver : IValueResolver<SourceObject, DestinationObject, DestinationStatus>
{
private readonly MyContext _context;
public StatusResolver(MyContext context)
{
_context = context;
}
public DestinationStatus Resolve(SourceObject source, DestinationObject destination, int member, ResolutionContext context)
{
return _context.DestinationStatuses.Find(source.StatusId);
}
}
然后
.ForMember(dest => dest.Status, opts => opts.MapFrom<StatusResolver>())