1

AutoMapper を使用して、アプリケーション データベースから取得したオブジェクトのデータを、クラスがわずかに異なる別のオブジェクトにマップする必要があります。違いは、名前空間と SubMessages という名前のプロパティで、すぐ下に表示されます。

   public Dictionary<int, QcMessageBody> SubMessages
   {
     get { return mSubMessages; }
     set { mSubMessages = value;}
   }

ここで、ディクショナリ キーはデータベース (ソース) からのオブジェクトの整数であり、宛先オブジェクトには文字列型のディクショナリ キーを持つ同じプロパティがあります。

クラス定義はまったく同じですが、既に説明した違いはありません。

あるオブジェクトを別のオブジェクトにマップするように AutoMapper を設定する方法を決定するのを手伝ってくれませんか。私は AutoMapper を初めて使用するので、これをセットアップするのに十分なほど AutoMapper を理解していないのではないかと心配しています。

ご協力いただきありがとうございます。

[Serializable()]
public class MessageProperties : QCProperties, ISerializable
{
   public MessageProperties() {}
   public Dictionary<string, QcMessageBody> SubMessages
   {
     get {}
     set {}
   }

   public QcMessageBody CurrentSubMessage
   {
     get
     {}
   }

   public Boolean IsVarMsg
   {
     get {}
     set {}
   }

   public Guid SenderId
   {
     get {}
     set {}
   }

   public String SenderName
   {
     get {}
     set {}
   }

   public MessageSchedule Schedule
   {
     get {}
     set {}
   }

   public DateTime TimeSent
   {
     get {}
     set {}
   }

   public Guid RowQueryId
   {
     get {}
     set {}
   }

   public Boolean Solo
   {
     get {}
     set {}
   }

   public List<DestinationTag> Destinations
   {
     get {}
     set {}
   }

   public MessageType MsgType
   {
     get {}
     set {}
   }
 }
4

1 に答える 1

1

私は自分の問題の解決策を見つけたので、それを報告して、AutoMapper を使用している他の人に役立つことを願っています。まず、間違ったオブジェクトをマッピングしようとしていました。コードをよく調べた結果、次のマルチレベル継承構成を持つクラスをマップする必要があると判断しました。

public class MessageInsert : ISerializable, ICloneable {}
public class DateTimeInsert : MessageInsert {}
public class TimeStampInsert : DateTimeInsert, ISerializable {}
public class DateStampInsert : DateTimeInsert, ISerializable {}
public class ClockInsert : DateTimeInsert, ISerializable {}
public class CalendarInsert : DateTimeInsert, ISerializable {}
public class DataInsert : MessageInsert, ISerializable {} 
public class TokenInsert : DataInsert, ISerializable {}
public class VariableInsert : DataInsert, ISerializable {}

MessageInsert オブジェクトをマップし、子レベルのすべてのプロパティを新しいオブジェクトにマップする必要がありました。AutoMapper は継承マッピングを処理しますが、CreateMap ステートメントを使用して特定の方法で設定する必要があります。以下で使用した CreateMap ステートメントは、マッピングの設定方法であり、機能しているように見えました。誰かがこれらを行うためのより良い方法を見つけて、ぜひチャイムを鳴らしたい場合.

ステートメントの最初のブロックは、名前空間が関連付けられているさまざまなクラス、列挙、構造体などの名前空間マッピングを処理するために使用されました。

AutoMapper.Mapper.CreateMap<ABC.QC.Properties.MessageSchedule, DBWebAgent.Properties.MessageSchedule>();
AutoMapper.Mapper.CreateMap<ABC.QC.Properties.DashPropType, DBWebAgent.Properties.DashPropType>();
AutoMapper.Mapper.CreateMap<ABC.QC.Properties.MessageType, DBWebAgent.Properties.MessageType>();
AutoMapper.Mapper.CreateMap<ABC.QC.Properties.DestinationTag, DBWebAgent.Properties.DestinationTag>();
AutoMapper.Mapper.CreateMap<ABC.QC.Properties.QcMessageBody, DBWebAgent.Properties.QcMessageBody>();
AutoMapper.Mapper.CreateMap<ABC.QC.Properties.DataInsertThreshold, DBWebAgent.Properties.DataInsertThreshold>();
AutoMapper.Mapper.CreateMap<ABC.QC.Properties.QuickCOMAlarm, DBWebAgent.Properties.QuickCOMAlarm>();
AutoMapper.Mapper.CreateMap<ABC.QC.Properties.ScrollEffectType, DBWebAgent.Properties.ScrollEffectType>();
AutoMapper.Mapper.CreateMap<ABC.QC.Properties.MessagePriorityType, DBWebAgent.Properties.MessagePriorityType>();
AutoMapper.Mapper.CreateMap<ABC.QC.Properties.QcMessageSegment, DBWebAgent.Properties.QcMessageSegment>();          
AutoMapper.Mapper.CreateMap<ABC.QC.Properties.DateTimeInsert, DBWebAgent.Properties.DateTimeInsert>();
AutoMapper.Mapper.CreateMap<ABC.QC.Properties.DateStampInsert, DBWebAgent.Properties.DateStampInsert>();
AutoMapper.Mapper.CreateMap<ABC.QC.Properties.TimeStampInsert, DBWebAgent.Properties.TimeStampInsert>();
AutoMapper.Mapper.CreateMap<ABC.QC.Properties.ClockInsert, DBWebAgent.Properties.ClockInsert>();
AutoMapper.Mapper.CreateMap<ABC.QC.Properties.CalendarInsert, DBWebAgent.Properties.CalendarInsert>();
AutoMapper.Mapper.CreateMap<ABC.QC.Properties.DataInsert, DBWebAgent.Properties.DataInsert>();
AutoMapper.Mapper.CreateMap<ABC.QC.Properties.VariableInsert, DBWebAgent.Properties.VariableInsert>();
AutoMapper.Mapper.CreateMap<ABC.QC.Properties.TokenInsert, DBWebAgent.Properties.TokenInsert>();

CreateMap ステートメントの 2 番目のセットは、クラス内の継承のすべてのレベルを処理するために定義されました。

AutoMapper.Mapper.CreateMap<ABC.QC.Properties.MessageInsert, DBWebAgent.Properties.MessageInsert>()
     .Include<ABC.QC.Properties.DateTimeInsert, DBWebAgent.Properties.DateTimeInsert>()
     .Include<ABC.QC.Properties.DateStampInsert, DBWebAgent.Properties.DateStampInsert>()
     .Include<ABC.QC.Properties.TimeStampInsert, DBWebAgent.Properties.TimeStampInsert>()
     .Include<ABC.QC.Properties.ClockInsert, DBWebAgent.Properties.ClockInsert>()
     .Include<ABC.QC.Properties.CalendarInsert, DBWebAgent.Properties.CalendarInsert>()
     .Include<ABC.QC.Properties.DataInsert, DBWebAgent.Properties.DataInsert>()
     .Include<ABC.QC.Properties.VariableInsert, DBWebAgent.Properties.VariableInsert>()
     .Include<ABC.QC.Properties.TokenInsert, DBWebAgent.Properties.TokenInsert>();
于 2013-07-30T16:02:06.907 に答える