C# 自动将一个表实体映射到两个DTO子类

C# 自动将一个表实体映射到两个DTO子类,c#,sql,automapper,dto,C#,Sql,Automapper,Dto,我有一个表消息: CREATE TABLE [Communication].[Message] ( [MessageID] BIGINT NOT NULL PRIMARY KEY IDENTITY, [MessageChannelID] INT NOT NULL, [MessageStatusID] INT NOT NULL, [Sender] NVARCHAR(100) NOT NULL, [SenderDisplayName] NVARCHAR(

我有一个表消息:

CREATE TABLE [Communication].[Message]
(
    [MessageID] BIGINT NOT NULL PRIMARY KEY IDENTITY, 
    [MessageChannelID] INT NOT NULL,
    [MessageStatusID] INT NOT NULL, 
    [Sender] NVARCHAR(100) NOT NULL, 
    [SenderDisplayName] NVARCHAR(100) NULL, 
    [Receiver] NVARCHAR(100) NOT NULL, 
    [Content] NVARCHAR(MAX) NULL, 
    [EmailUseSSL] BIT NOT NULL DEFAULT 0, 
    [EmailReceiverCC] NVARCHAR(100) NULL, 
    [EmailReceiverBCC] NVARCHAR(100) NULL, 
    [EmailSenderReplyTo] NVARCHAR(100) NULL, 
    [EmailSubject] NVARCHAR(300) NULL, 
    [SMSGUID] NVARCHAR(100) NULL, 
    [CreatedAt] DATETIME NOT NULL DEFAULT getDate(), 
    [Note] NVARCHAR(300) NULL, 
    CONSTRAINT [FK_Message_MessageStatus] FOREIGN KEY ([MessageStatusID]) REFERENCES [Communication].[MessageStatus]([MessageStatusID]), 
    CONSTRAINT [FK_Message_MessageChannel] FOREIGN KEY ([MessageChannelID]) REFERENCES [Communication].[MessageChannel]([MessageChannelID])
)
我有DTO课程:

public class MessageDTO
{
    public int MessageID { get; set; }
    public string Sender { get; set; }
    public string SenderDisplayName { get; set; }
    public string Receiver { get; set; }
    public string Content { get; set; }
    public DateTime CreatedAt { get; internal set; }
    public string Note { get; set; }
    public MessageStatus Status { get; set; }
    public MessageChannel Channel { get; internal set; }
}

public class EmailMessageDTO: MessageDTO
{
    public bool EmailUseSSL { get; set; }
    public string EmailReceiverCC { get; set; }
    public string EmailReceiverBCC { get; set; }
    public string EmailSenderReplyTo { get; set; }
    public string EmailSubject { get; set; }
}

public class SMSMessageDTO: MessageDTO
{
    public string SMSGUID { get; set; }
}

可以从MessageChannelID(电子邮件、SMS)解析消息类型。是否可以使用Automapper获取所有具有特定状态的邮件,以便将某些邮件映射到EmailMessageDTO,而将其他邮件映射到SMSMessageDTO?我想编写一个GetMessages方法,根据消息类型返回所有消息,对象为EmailMessageDTO或SMSMessageDTO。

在Charleh的评论之后,我提出了以下建议:

x.CreateMap<Message, MessageDTO>()
                    .ForMember(m => m.Status, opts => opts.MapFrom(src => src.MessageStatusID))
                    .ForMember(m => m.Channel, opts => opts.MapFrom(src => src.MessageChannelID))
                    .ConstructUsing(m =>
                    {
                        if (m.MessageChannelID == (int)Data.MessageChannel.Email)
                            return new EmailMessageDTO
                            {
                                EmailReceiverBCC = m.EmailReceiverBCC,
                                EmailReceiverCC = m.EmailReceiverCC,
                                EmailSenderReplyTo = m.EmailSenderReplyTo,
                                EmailSubject = m.EmailSubject,
                                EmailUseSSL = m.EmailUseSSL
                            };
                        else return new SMSMessageDTO
                        {
                            SMSGUID = m.SMSGUID
                        };
                    });
x.CreateMap()
.ForMember(m=>m.Status,opts=>opts.MapFrom(src=>src.MessageStatusID))
.ForMember(m=>m.Channel,opts=>opts.MapFrom(src=>src.MessageChannelID))
.ConstructUsing(m=>
{
if(m.MessageChannelID==(int)Data.MessageChannel.Email)
返回新的EmailMessageDTO
{
EmailReceiveBCC=m.EmailReceiveBCC,
EmailReceiveCC=m.EmailReceiveCC,
EmailSenderReplyTo=m.EmailSenderReplyTo,
EmailSubject=m.EmailSubject,
EmailUseSSL=m.EmailUseSSL
};
否则返回新的SMSMessageDTO
{
SMSGUID=m.SMSGUID
};
});

您是否尝试过这样的操作:-基本上使用
ConstructUsing
函数并映射到基类型-任何映射都将通过
ConstructUsing
创建实例。唯一的问题可能是特定的映射选项可能不可能,我不确定AutoMapper是否会意识到它不再是
dto->base
映射并使用更具体的映射配置。我看到了这个解决方案,它帮助我解决了这个问题!很酷,它仍然是一个小手册,但至少它包含在映射配置中,所以您不必考虑它:)