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
映射并使用更具体的映射配置。我看到了这个解决方案,它帮助我解决了这个问题!很酷,它仍然是一个小手册,但至少它包含在映射配置中,所以您不必考虑它:)