‫۵ سال و ۴ ماه قبل، سه‌شنبه ۳۱ اردیبهشت ۱۳۹۸، ساعت ۱۳:۴۹
یک مثال تکمیلی: روش ذخیره‌ی آرایه‌ای از رشته‌ها
public class MyEntity
{
   public Guid Id {get;set;}
   public string[] Strings { get; set; } 
}
توسط تبدیلگر زیر:
modelBuilder.Entity<MyEntity>()
   .Id(e=> e.Id)
   .Property(e => e.Strings)
   .HasConversion(
         v => string.Join(',', v),
         v => v.Split(',', StringSplitOptions.RemoveEmptyEntries));
‫۵ سال و ۴ ماه قبل، سه‌شنبه ۳۱ اردیبهشت ۱۳۹۸، ساعت ۰۰:۴۱
با تنظیم baseUrl به پوشه‌ی src، ریشه‌ی بررسی از داخل این پوشه شروع می‌شود. بنابراین برای اشاره‌ی به پوشه‌ای که یک سطح بالاتر است (یا همان پوشه‌ی dist که حاوی فایل‌های کامپایل شده‌ی کتابخانه است)، به این صورت عمل کنید:
    "baseUrl": "src",
    "paths": {
      "@app/*": [
        "app/*"
      ],
      "@app/core/*": [
        "app/core/*"
      ],
      "@app/shared/*": [
        "app/shared/*"
      ],
      "@env/*": [
        "environments/*"
      ],
      "my-lib": [
        "../dist/my-lib"
      ],
      "my-lib/*": [
        "../dist/my-lib/*"
      ]
    }
‫۵ سال و ۴ ماه قبل، دوشنبه ۳۰ اردیبهشت ۱۳۹۸، ساعت ۱۸:۰۱
یک نکته‌ی تکمیلی
بجای NBench، این‌روزها BenchmarkDotNet تبدیل به استانداردی برای اندازه‌گیری کارآیی برنامه‌های دات نت شده‌است. چند نمونه مثال از کاربرد آن توسط تیم‌های مایکروسافت جهت اندازه‌گیری کارآیی قسمت‌های مختلف NET Core.:
‫۵ سال و ۴ ماه قبل، دوشنبه ۳۰ اردیبهشت ۱۳۹۸، ساعت ۱۵:۰۱
همانطور که در مطلب هم عنوان شد، از آخرین نگارش موجود آن یعنی 5.0.0rc2 استفاده شده:
<Project Sdk="Microsoft.NET.Sdk.Web">
  <ItemGroup>
    <PackageReference Include="Swashbuckle.AspNetCore" Version="5.0.0-rc2" />
  </ItemGroup>
</Project>
‫۵ سال و ۴ ماه قبل، یکشنبه ۲۹ اردیبهشت ۱۳۹۸، ساعت ۲۳:۲۱
این تنظیم بر روی import کتابخانه‌ها تاثیری ندارد و نباید داشته باشد. باید به یک کتابخانه همانند بسته‌های npm نگاه کنید که import آن‌ها وابسته به مسیرهای پروژه‌ی استفاده کننده‌ی از آن نیست و کاملا مستقل از آن است. در اینجا جهت سهولت کار « .... قسمت paths آن نیز به صورت خودکار ویرایش شده‌است ...» تا مسیر کتابخانه را بتوانید همانند سطر سوم تصویری که ارسال شد، تعیین کنید (این مسیر نسبی نیست) و اگر شناسایی نمی‌شود، تنظیم compilerOptions مربوط به paths را که در متن جاری ذکر شده، بررسی کنید:

‫۵ سال و ۴ ماه قبل، یکشنبه ۲۹ اردیبهشت ۱۳۹۸، ساعت ۱۶:۴۸
خواص سایه‌ای =  خواصی که نمی‌خواهیم جلوی چشم ما باشند
بنابراین تعریف Id یک رابطه به صورت خاصیت سایه‌ای اشتباه است و هدف آن چنین چیزی نیست. هدف آن تعریف خواصی مانند CreatedByBrowserName، CreatedByIp، ModifiedByIp و امثال آن است که بیشتر شاید روزی برای بازبینی سیستم مورد استفاده قرار گیرند؛ شاید هم هیچ وقت.
‫۵ سال و ۴ ماه قبل، یکشنبه ۲۹ اردیبهشت ۱۳۹۸، ساعت ۱۵:۵۴
متد EF.Property در Selectها هم قابل استفاده‌است:
var items = (from p in context.Categories
                select new  
                {  
                    Id = p.Id,  
                    Name = p.Name,  
                    DateAdded = EF.Property<DateTime>(p, "DateAdded")  
                }).ToList();

و یا خارج از کوئری اصلی توسط Change Tracking API:
var cList = context.Categories
        .OrderBy(b => EF.Property<DateTime>(b, "DateAdded")).ToList();
foreach (var cat in cList)
{
   Console.Write("Category Name: " + cat.CategoryName);
   Console.WriteLine(" Created: " + context.Entry(cat).Property("DateAdded").CurrentValue);
}
‫۵ سال و ۴ ماه قبل، پنجشنبه ۲۶ اردیبهشت ۱۳۹۸، ساعت ۱۶:۳۵
چند نکته‌ی تکمیلی
چگونه فایل دریافتی را تبدیل به آرایه‌ای از بایت‌ها کنیم؟
public async Task<IActionResult> FileUpload(IFormFile file)
        {
            if (file == null || file.Length == 0)
            {
                return BadRequest();
            }

            using (var memoryStream = new MemoryStream())
            {
                await file.CopyToAsync(memoryStream);
                var fileBytes = memoryStream.ToArray();
                // ... save it
            }
        }

چگونه فایل تصویر دریافتی را تبدیل به یک شیء تصویر کنیم؟
public async Task<IActionResult> FileUpload(IFormFile file)
        {
            if (file == null || file.Length == 0)
            {
                return BadRequest();
            }

            using (var memoryStream = new MemoryStream())
            {
                await file.CopyToAsync(memoryStream);
                using (var img = Image.FromStream(memoryStream))
                {
                  // TODO: ResizeImage(img, 100, 100);
                }
            }
        }
‫۵ سال و ۴ ماه قبل، چهارشنبه ۲۵ اردیبهشت ۱۳۹۸، ساعت ۱۵:۲۸
یک نکته‌ی تکمیلی: نمونه‌هایی از آزمایش‌های Postman


بررسی status code دریافتی از سرور
pm.test("Status code is 200", function () {
    pm.response.to.have.status(200);
});

pm.test("Status code is 200", function () {
    pm.expect(pm.response.code).to.equal(200);
});

pm.test("Request is successful", function () {
    pm.response.to.be.succes;
}); // Status code is in the 2XX range

pm.test("Request results in a client error", function () {
    pm.response.to.be.clientError;
}); // Status code is in the 4XX range

pm.test("Request results in a Not Found error", function () {
    pm.response.to.be.notFound;
}); // 404

pm.test("Status code is 200 or 204", function () {
    pm.expect([200, 204]).to.include(pm.response.code);
});

بررسی هدرهای دریافتی از سرور
pm.test("Response has Content-Type header", function () {
    pm.response.to.have.header("Content-Type");
});

pm.test("Response has Content-Type header with application/json; charset = utf - 8 as value", function () {
    pm.response.to.have.header(
        'Content-Type',
        'application/json; charset=utf-8');
});

بررسی بدنه‌ی درخواست
pm.test("Response has a non-empty body", function () {
    pm.expect(pm.response.text()).not.empty;
});

pm.test("Response has a non-empty body", function () {
    pm.expect(pm.response.json()).not.empty;
});

pm.test("Response has a non-empty body", function () {
    pm.response.to.have.body();
});

pm.test("Response has a non-empty body", function () {
    pm.response.to.have.jsonBody();
});

بررسی خواص اشیاء دریافتی از سرور
var updatedAuthor = pm.response.json();
pm.test("Author properties have been updated", function () {
    pm.expect(updatedAuthor.firstName).to.equal("Vahid");
    pm.expect(updatedAuthor.lastName).to.equal("N");
});