‫۵ سال و ۵ ماه قبل، جمعه ۳۰ فروردین ۱۳۹۸، ساعت ۲۳:۲۲
یک نکته‌ی تکمیلی

اگر قصد تولید بسته‌ی نیوگتی را دارید و این بسته برای NET Standard 2.0. تهیه شده‌است، نیوگت اجازه می‌دهد تا این بسته توسط پروژه‌های دات نت فریم ورک 4.6.1 به بعد هم استفاده شود که نباید اینگونه باشد و باید به 4.7.2 یا بیشتر محدود شود.
‫۵ سال و ۵ ماه قبل، جمعه ۳۰ فروردین ۱۳۹۸، ساعت ۰۱:۰۱
- هدف اصلی از EnableFriendlyUrls (که آخرین به روز رسانی آن مربوط به سال 2013 است) این است که به ازای تک‌تک صفحات aspx، کار تعریف MapPageRouteها را دستی انجام ندهید و گرنه نوشتن MapPageRoute مجزا، یعنی تعریف یک مسیریابی جدید.
- برای تبدیل خودکار یک آدرس به آدرس دیگر، نیاز است مباحث IIS url rewrite را پیگیری کنید و یا از RouteMagic استفاده کنید که redirect از یک مسیریابی به مسیریابی دیگر را هم پشتیبانی می‌کند .
‫۵ سال و ۵ ماه قبل، پنجشنبه ۲۹ فروردین ۱۳۹۸، ساعت ۱۷:۲۳
مثال انتهای بحث «مروری بر قابلیت جدید ASP.NET FriendlyUrls» را اجرا کنید. بعد از اجرا، developer tools مرورگر را باز کرده و در برگه‌ی network آن، مراحل بارگذاری صفحه‌ی default.aspx را در صورت درخواست مستقیم آن بررسی کنید:

زمانیکه برای بار اول آدرس default.aspx فراخوانی می‌شود، بلافاصله status مساوی 301 را دریافت می‌کنید که دقیقا معادل تنظیم AutoRedirectMode = RedirectMode.Permanent بحث جاری است. این مورد کل نکته‌ی مطلب جاری است.

اگر موتور جستجویی، آدرس default.aspx را درخواست داد، بله، هنوز هم وجود دارد. اما درخواهد یافت که به صورت دائم به آدرس default/ منتقل شده و تنها همین آدرس را لحاظ خواهد کرد (به همین جهت به آن نکته‌ی «بهبود SEO» گفته می‌شود).

‫۵ سال و ۵ ماه قبل، چهارشنبه ۲۸ فروردین ۱۳۹۸، ساعت ۰۴:۰۷
- اگر با SQL Server کار کرده باشید، حتما دیده‌اید که سرعت اجرای یک کوئری در بار دوم و پس از آن، بسیار بسیار بیشتر از اجرای اول آن است. یکی از مهم‌ترین دلایل آن، به buffer cache مرتبط می‌شود که کارش کش کردن صفحات اطلاعات مرتبط با داده‌های کوئری‌های انجام شده‌است. هر زمانیکه در SQL Server اطلاعاتی از بانک اطلاعاتی خوانده می‌شود، این اطلاعات در RAM سرور هم کپی می‌شوند. نکته‌ی مهم اینجا است که SQL Server هرچقدر RAM را که بتواند برای این منظور مورد استفاده قرار می‌دهد و در این حالت اگر کسی با این نکته آشنایی نداشته باشد یا تصور می‌کند که SQL Server دچار نشتی حافظه شده‌‌است و یا پس از مدتی با کمبود RAM در سرور مواجه خواهد شد. اطلاعات بیشتر
‫۵ سال و ۵ ماه قبل، یکشنبه ۲۵ فروردین ۱۳۹۸، ساعت ۱۳:۴۵
یک نکته‌ی تکمیلی: برای کار با نگارش‌های مختلف NET Core. نیاز به چه نگارشی از Visual Studio وجود دارد؟

.NET Core SDK .NET Core Runtime Compatible Visual Studio MSBuild Notes
2.1.5nn 2.1 2017 15 Installed as part of VS 2017 version 15.9
2.1.6nn 2.1 2019 16 Installed as part of VS 2019
2.2.1nn 2.2 2017 15 Installed manually
2.2.2nn 2.2 2019 16 Installed as part of VS 2019
3.0.1nn 3.0 (Preview) 2019 16 Installed manually

و یا از VSCode استفاده کنید.
‫۵ سال و ۵ ماه قبل، پنجشنبه ۲۲ فروردین ۱۳۹۸، ساعت ۱۹:۳۳
به ازای هر FK یک Collection مجزا باید داشته باشید و همچنین از Fluent API هم باید استفاده کنید:
public class User
{
    public int UserId { get; set;} 
    public string Name { get; set; }

    public virtual ICollection<Comment> HomeCommentes { get; set; }
    public virtual ICollection<Comment> AwayCommentes { get; set; }
}

public class Comment
{
    public int CommentId { get; set; }

    public int HomeUserId { get; set; }
    public int GuestUserId { get; set; }

    public virtual User HomeUser { get; set; }
    public virtual User GuestUser { get; set; }
}


public class Context : DbContext
{
    ...

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Comment>()
                    .HasRequired(m => m.HomeUser)
                    .WithMany(t => t.HomeCommentes)
                    .HasForeignKey(m => m.HomeUserId)
                    .WillCascadeOnDelete(false);

        modelBuilder.Entity<Comment>()
                    .HasRequired(m => m.GuestUser)
                    .WithMany(t => t.AwayCommentes)
                    .HasForeignKey(m => m.GuestUserId)
                    .WillCascadeOnDelete(false);
    }
}
‫۵ سال و ۵ ماه قبل، دوشنبه ۱۹ فروردین ۱۳۹۸، ساعت ۲۲:۵۳
- اگر فکر می‌کنید که 2 بار چک کردن به ازای هر درخواست زیاد هست، احتمالا با ASP.NET Identity کار نکردید! در ASP.NET Identity اگر بررسی اعتبار کاربر را به ازای هر درخواست رسیده فعال کنید (بجای مقدار پیش‌فرض چند دقیقه‌ای آن، این مقدار را صفر کنید تا به ازای هر درخواست انجام شود)، همین یک مورد 5 کوئری را شامل می‌شود. برای نمونه در ASP.NET Core 2.X این بررسی‌ها شامل 5 کوئری به جداول AspNetUser, AspNetUserClaims, AspNetUserRoles, AspNetRoles, AspNetRoleClaims هستند.
- 2 بار بررسی بانک اطلاعاتی برای بانک‌های اطلاعاتی امروزی هیچ سرباری ندارد و ضمن اینکه خودشان مباحث کش کردن اطلاعات ویژه‌ای را هم برای کوئری‌های پر استفاده دارند؛ مانند buffer cache در SQL Server که تا حد مصرف حافظه‌ی کل سرور هم می‌تواند پیش رود.
- استفاده از متغیرهای استاتیک و حافظه‌ی سرور برای کش کردن، مقیاس پذیر نیست. در این موارد روش توصیه شده، استفاده از بانک اطلاعاتی Key/Value فوق سریع Redis هست. فقط مشکل تمام کش‌ها، هماهنگ سازی اطلاعات آن‌ها با بانک اطلاعاتی اصلی است که باید مدنظر باشند.