2017-04-24 67 views
0

我有一个表的消息:自动映射一个表实体两个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(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。

+0

你有没有尝试过这样的:http://stackoverflow.com/questions/9746650/automapper-conditional-mapping-for-type - 实质上是使用'ConstructUsing'函数和映射到基类型 - 任何映射都将通过'ConstructUsing'创建它们的实例。唯一的问题可能是特定的映射选项可能不可行,我不确定AutoMapper是否会意识到它不再是'dto - > base'映射并使用更具体的映射配置。 – Charleh

+0

我看到了这个解决方案,它帮助我解决了这个问题! – vpetrovic

回答

1

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 
         }; 
        }); 
+0

酷,它仍然有点手动,但至少它包含在映射配置,所以你不必考虑它:) – Charleh

相关问题