1

自動生成されたクラスをデータベースからドメイン/ビューモデル クラスにマップするだけです。自動生成されたクラスには、CustomerId にマップしたい customer_id のような名前が含まれている場合があります。どうにか自分の規約をオートマッパーに登録したい。次のコードから始めましたが、マップされたオブジェクトのプロパティは設定されていません:

  // Generic method that should map source to target
  public static TTarget MapWithUnderScoreConvension(TSource source, TTarget target)
    {
        Mapper.Initialize(cfg=> cfg.AddProfile<AutoMapperUnderScoreProfile>());
        Mapper.CreateMap<TSource, TTarget>();
        var mapped = Mapper.Map(source, target);
        return mapped;
    } 

 // New underscore profile
public class AutoMapperUnderScoreProfile : Profile
{
    public AutoMapperUnderScoreProfile()
    {
        Mapper.Initialize(configuration => configuration.CreateProfile("UnderScoreProfile", UnderScoreProfile));
        Mapper.AssertConfigurationIsValid();
    }

    private void UnderScoreProfile(IProfileExpression profile)
    {
        profile.SourceMemberNamingConvention = new PascalCaseNamingConvention();
        profile.DestinationMemberNamingConvention = new SourceUnderScoreNamingConvension();
    }
}

// Convention class
public class SourceUnderScoreNamingConvension : INamingConvention
{
    private readonly string _separatorCharacter="_";
    private readonly Regex _splittingExpression = new Regex(@"[\p{Lu}0-9]+(?=_?)");

    public Regex SplittingExpression { get { return _splittingExpression;} private set{} }
    public string SeparatorCharacter { get { return _separatorCharacter; } private set{} }
}

// Test cases
 [TestMethod()]
    public void Test_Map_Db_Generated_Class_To_Model()
    {
        var dbGenerated = new QuestionTypeFromDb()
        {
            QuestionType_Description = "1",
            QuestionType_Id = 1,
            QuestionType_Is_Default = true,
            QuestionType_Is_TimeBased = true,
            QuestionType_Sequence = 1,
            QuestionType_Time_In_Seconds = 1
        };

        var mappedObject = AutoMapperHelper<QuestionTypeFromDb, QuestionType>
            .MapWithUnderScoreConvension(dbGenerated, new QuestionType());

        mappedObject.QuestionTypeId.Should().Be(dbGenerated.QuestionType_Id);
        mappedObject.QuestionTypeDescription.Should().Be(dbGenerated.QuestionType_Description);
        mappedObject.TimeInSeconds.Should().Be(dbGenerated.QuestionType_Time_In_Seconds);
        mappedObject.QuestionTypeSequence.Should().Be(dbGenerated.QuestionType_Sequence);
    }

 public class TestQuestionWithAnswerType 
{
    public int QuestionTypeId { get; set; }
    public string QuestionTypeDescription { get; set; }
    public int QuestionTypeSequence { get; set; }
    public bool QuestionTypeIsTimeBased { get; set; }
    public int? QuestionTypeTimeInSeconds { get; set; }
    public bool QuestionTypeIsDefault { get; set; }
}

コメントをいただければ幸いです。

アップデート

次の回避策が機能することを発見しました。

 public static TTarget MapWithUnderScoreConvension(TSource source, TTarget target)
    {
        Mapper.Initialize(c => c.ReplaceMemberName("_", ""));
        //Mapper.Initialize(cfg => cfg.AddProfile<AutoMapperUnderScoreProfile>());
        Mapper.CreateMap<TSource, TTarget>();
        var mapped = Mapper.Map(source, target);
        return mapped;
    }
4

2 に答える 2