چگونگی رسیدگی به Null property در AutoMapper
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: یک دقیقه

AutoMapper کتابخانه‌ای برای نگاشت اطلاعات یک شیء به شی‌ءایی دیگر به صورت خودکار می‌باشد.

در این مقاله چگونگی رسیدگی به Null property را در AutoMapper   بررسی خواهیم کرد. فرض کنید شیء منبع دارای یک خاصیت Null  است و می‌خواهید به وسیله Automaper شیء منبع را به مقصد نگاشت نمایید. اما می‌خواهید در صورت Null بودن شیء مبدا، یک مقدار پیش فرض برای شیء مقصد در نظر گرفته شود .

برای نمونه کلاسuser   را که در آن از کلاس Address یک خاصیت تعریف شده، در نظر بگیرید. اگر مقدار آدرس در شیء منبع خالی بود شاید شما بخواهید مقدار آن را به صورت empty string و یا با یک مقدار پیش فرض در مقصد مقدار دهی کنید.

همانند مثال زیر : 

public class UserSource
{
  public Address Address{get;set;}
}
 
public class UserDestination
{
  public string Address{get;set;}
}
ابتدا نگاشت‌ها را تعریف می‌کنیم:
AutoMapper.Mapper.CreateMap<UserSource, UserDestination>()
          .ForMember(dest => dest.Address
          , opt => opt.NullSubstitute("Address not found")
          );
کد بالا نشان دهنده تبدیل Address به Address است ولی دارای متد اختیاری NullSubstitute می‌باشد و بیانگر این است که اگر آدرس شیء منبع Null بود، مقدار پیش فرضی را برای شیء مقصد در نظر بگیرد. در انتها  می‌توان نگاشت را در برنامه متناسب با نیاز خود انجام داد:
var model = AutoMapper.Mapper.Map<UserSource, UserDestination>(user);
var models = AutoMapper.Mapper.Map<IEnumerable<UserSource>, IEnumerable<UserDestination>>(users);
  • #
    ‫۱۱ سال و ۵ ماه قبل، سه‌شنبه ۲۴ اردیبهشت ۱۳۹۲، ساعت ۰۱:۱۱

    با سلام

    مهندس من یه دیتابیس دارم که حاوی اطلاعات است در جداول اون در تمام ستون‌ها به غیر از ستون کلید اومده تیک alow null  رو فعال کرده یعنی این ستون‌ها می‌تونه مقدار null رو بگیره .

    حالا اون برنامه که این اطلاعات رو وارد دیتابیس کرده اومده هر ستونی که نوعش رشته بوده مقدار empty وارد کرده نه null و ستون هایی که نوعشون int هست مقدار صفر وارد کرده , مثل همین مطلبی که شما گفتید اما به صورت سنتی .

    به نظر شما من باید همین رویه رو با روش شما انجام بدم یا نه همون مقدار null و در دیتابیس ذخیره کنم ؟

    • #
      ‫۱۱ سال و ۵ ماه قبل، سه‌شنبه ۲۴ اردیبهشت ۱۳۹۲، ساعت ۰۲:۱۶
      سلام
      بستگی به کار خودتون داره . مطلب بالا مربوط به نگاشت اطلاعات یک شیء به شی‌ءایی دیگره  .اما شما برای در نظر گرفتن مقدار پیش فرض در دیتابیس همون طور که میدونید  با تنظیم Default Value or Binding  میتنونی  مقدار پیش فرضی برای ستون‌های Null در نظر بگیری.

  • #
    ‫۱۰ سال و ۴ ماه قبل، چهارشنبه ۲۱ خرداد ۱۳۹۳، ساعت ۲۱:۱۴
    سلام
    من از Automapper واسه مپ کردن مدل و ویو مادل‌ها تو برنامه ام استفاده میکنم
    مشکلم اینجاست که در کلاس model یه فیلد از نوع byte[] دارم
     public class News : BaseEntity
        {
    public byte[] SmallImage { get; set; } // SmallImage
         }
    در viewModel هم دقیقا همین فیلد رو دارم.
    منتهی موقع مپ کردن این فیلد null میشه.
    news = model.ToEntity(news);
    public static News ToEntity(this NewsModel model, News destination)
            {
                Mapper.CreateMap<NewsModel, News>();
                return Mapper.Map(model, destination);
            }
    علتش رو نمیدونم، کسی هست بدونه؟
    باتشکر
    • #
      ‫۱۰ سال و ۴ ماه قبل، پنجشنبه ۲۲ خرداد ۱۳۹۳، ساعت ۱۳:۴۵
      public class TestModel
          {
              public byte[] MProperty { get; set; }
          }

       public class TestViewModel
          {
             public byte[] VMProperty { get; set; }
          }

      class Program
          {
              static void Main(string[] args)
              {
                  Mapper.CreateMap<TestModel,TestViewModel>().ForMember(tv=>tv.VMProperty,m=>m.MapFrom(t=>t.MProperty));
                  TestModel tm = new TestModel();
                  tm.MProperty = new byte[]  { 1, 2, 3 ,4};
      
                  TestViewModel tvm = Mapper.Map<TestModel, TestViewModel>(tm);
                  foreach (var item in tvm.VMProperty)
                  {
                      Console.WriteLine(item.ToString());
                  }
                  Console.ReadKey();
              }
          }
      در صورتی که MProperty، مقدار داشته باشه مشکلی پیش نمیاد اگر هم null باشه بازم مشکلی پیش نمیاد و VMProperty برابر با null هست.