‫۹ سال و ۵ ماه قبل، شنبه ۱۹ اردیبهشت ۱۳۹۴، ساعت ۰۳:۴۴
با سلام؛ چطور میشه تو signalr2 متد OnDisconnected() رو وقتی رو دکمه ای کلیک میکنیم فراخوانی کرد؟
در ضمن این کد هم کار نمیکنه.
window.onbeforeunload = function (e) {
    $.connection.hub.stop();
};
یه سوال دیگه : فرض کنید چند تا تب مرورگر باز باشه و کاربر به سیستم لاگین کرده باشه و چند صفحه مختلف سایت باز باشه. اگه قرار باشه با بستن هر تب رویداد Ondisconnected() فراخوانی بشه و کاربر جاری از لیست کاربران آنلاین حذف بشه در صورتی که تب دیگه ای باز باشه چطور میشه آمار کاربران آنلاین رو داشت؟
به صورت کلی چطور میتونم زمانی که کاربر دکمه خروج رو میزنه یکی از کاربران آنلاین رو از لیست کاربران آنلاین حذف کنم. و اینکه اگه کاربر دکمه خروج و نزنه و همه تب‌های مرورگر خودش و که مربوط به سایت ماست ببنده جطور مدیریت میشه؟
‫۹ سال و ۵ ماه قبل، چهارشنبه ۹ اردیبهشت ۱۳۹۴، ساعت ۱۸:۴۹
کاری که در اینجا انجام شده، ایجاد یک Mapping Engine سفارشی هست که با Mapping Engine اصلی استاتیک یکی نیست. به همین جهت برای نمونه متد Project آرگومان (Project(_mappingEngine هم دارد. اگر قید نشود، یعنی قرار است از موتور نگاشت استاتیک سراسری پیش فرض آن استفاده شود.
‫۹ سال و ۵ ماه قبل، چهارشنبه ۹ اردیبهشت ۱۳۹۴، ساعت ۱۸:۱۵
در این صورت نگاشت کلاس‌ها باید داخل لایه سرویس توسط Mapper.Map صورت گیرد:
public IList<AdvertismentViewModel> GetAdvertisementsByMe(int userId)
        {
            Mapper.CreateMap<Advertisement, AdvertismentViewModel>();
            var adsList = _advertisements.Where(x => x.UserId == userId).Project().To<AdvertismentViewModel>().ToList();
            return adsList;
        }
چون در غیر اینصورت استثنای InvalidOperationException صادر خواهد شد.
‫۹ سال و ۵ ماه قبل، چهارشنبه ۹ اردیبهشت ۱۳۹۴، ساعت ۱۶:۱۶
یک نکته‌ی تکمیلی
فراخوانی متدهای متداول EF مانند ToList و FirstOrDefault  و امثال آن، اگر به همراه Select نباشند ، سبب واکشی تمام فیلدها و خواص جدول مورد نظر می‌شوند. اما اگر از متد Project To مانند مطلب فوق استفاده کنید، واکشی انجام شده به صورت خودکار تنها بر اساس خواص موجود در ViewModel صورت می‌گیرد و به این ترتیب حجم کمتری از اطلاعات رد و بدل خواهد شد (چون AutoMapper کار نوشتن Select را بر اساس خواص ViewModel، در پشت صحنه انجام داده‌است و این Select حاوی تمام خواص کلاس جدول مورد استفاده نیست).
‫۹ سال و ۵ ماه قبل، چهارشنبه ۹ اردیبهشت ۱۳۹۴، ساعت ۱۶:۱۲
یک نکته‌ی تکمیلی:
اگر با EF کار می‌کنید و LINQ to Objects نیست، از متد Project To بهتر است استفاده کنید:
ctx.Advertisements.Where(...).Project().To<AdvertisementViewModel>().ToList()
مزیت این روش این است که فقط خواص موجود در ViewModel از بانک اطلاعاتی واکشی می‌شوند؛ برای نمونه در اینجا و این مثال، فقط سه مورد.
اگر ابتدا ToList خود EF را فراخوانی کنید، تمام خواص کلاس Advertisment از بانک اطلاعاتی واکشی خواهند شد و مرحله‌ی بعد LINQ to Objects می‌شود.
‫۹ سال و ۵ ماه قبل، چهارشنبه ۹ اردیبهشت ۱۳۹۴، ساعت ۱۶:۰۱
- آیا کلاس پروفایل این نگاشت مورد نظر تعریف شده‌است (کلاس حاوی CreateMap)؟
- اگر بله، در متد configureAutoMapper روی سطر configuration.AddProfile یک break point قرار دهید و بررسی کنید که آیا فراخوانی می‌شود؟ یعنی آیا به صورت خودکار یافت شده و به سیستم اضافه می‌شود یا خیر؟
- اگر این break point فراخوانی نمی‌شود، این کلاس پروفایل در چه اسمبلی قرار دارد؟ بازه‌ی اسکن استراکچرمپ را باید تغییر دهید یا وسیع‌تر کنید. برای مثال scan.TheCallingAssembly فقط اسمبلی فراخوان را اسکن می‌کند. اگر نیاز است اسمبلی دیگری هم اسکن شود، از متد AssemblyContainingType استفاده کنید:
 Scan(scan =>
    {
        scan.AssemblyContainingType<یکی از کلاس‌های پروفایل این اسمبلی خاص>();
        //....
    });
‫۹ سال و ۵ ماه قبل، چهارشنبه ۹ اردیبهشت ۱۳۹۴، ساعت ۱۵:۳۰
ممنون از شما،
یک سوال: بنده کلاس ObjectFactory را همانطور که فرمودید به  این  صورت تغییر دادم. در لایه سرویس نیز این متد را تهیه کرده‌ام:
public IList<AdvertismentViewModel> GetAdvertisementsByMe(int userId)
{
            var adsList = _advertisements.Where(x => x.UserId == userId).ToList();
            var adsViewModel = new List<AdvertismentViewModel>();
            _mappingEngine.Map(source: adsList, destination: adsViewModel);
            return adsViewModel;
}
در متد فوق کلاس Advertisment به کلاس زیر نگاشت داده شده است:
public class AdvertismentViewModel
    {
        public string Image { get; set; }
        public string Title { get; set; }
        public string ExpireDate { get; set; }
    }
اما با فراخوانی متد GetAdvertisementsByMe استثناء AutoMapperMappingException صادر می‌شود:
Missing type map configuration or unsupported mapping.

Mapping types:
Advertisement -> AdvertismentViewModel
Project.DomainClasses.Advertisement -> Project.Models.AdvertismentViewModel

Destination path:
List`1[0]

Source value:
System.Data.Entity.DynamicProxies.Advertisement_E82DFF273E08C95AA785F8F7A0D2B5ABC8E54C4566DFE1C8A92D8D3C447608AE

‫۹ سال و ۵ ماه قبل، سه‌شنبه ۸ اردیبهشت ۱۳۹۴، ساعت ۲۳:۳۱
در حالت فوق اولین چیزی که به ذهنم رسید رندر کردن خروجی با استفاده از ChildAction بود یعنی به این صورت:
[ChildActionOnly]
        public async Task<ActionResult> GetLastActivity()
        {
            var query = await _userManager.FindByIdAsync(User.Identity.GetUserId<int>());
            var result = query.LastActivity;
            return PartialView("GetLastActivity", result);
        }
ویو:
@model DateTime
@Model
اما به محض اجرای برنامه استثنای زیر صادر شد:
{"HttpServerUtility.Execute blocked while waiting for an asynchronous operation to complete."}
در نهایت بعد از کمی جستجو متوجه شدم که ChildAction‌ها از async پشتیبانی نمی‌کنند(+) 
در هر صورت ممنون، از روشی که پیشنهاد دادید استفاده خواهم کرد.
‫۹ سال و ۵ ماه قبل، سه‌شنبه ۸ اردیبهشت ۱۳۹۴، ساعت ۲۳:۲۰
در این حالت خاص ضرورتی به استفاده از متدهای Async نیست و اگر ASP.NET Identity نمونه‌ی غیر async ارائه نداده‌است، خودتان ایجاد کنید. برای مثال در کلاس ApplicationUserManager ، شیء this.Users معادل همان ()<users = _uow.Set<ApplicationUser_ است.