‫۹ سال و ۱۰ ماه قبل، یکشنبه ۹ آذر ۱۳۹۳، ساعت ۱۴:۴۴
- مدل توضیح داده شده در اینجا Adjacency model است و شباهت زیادی به «مدل‌های خود ارجاع دهنده» دارد. طراحی خودتان را بر اساس مطلب یاد شده انجام دهید و یا نگاشت نهایی اطلاعات خودتان را تبدیل کنید به این حالت. مهم نیست ساختار اصلی بانک اطلاعاتی شما به چه صورتی است. همینقدر که خروجی کوئری آن Adjacency model باشد (شبیه به ساختار کلاس BlogComment مطلب فوق)، با توضیحات فوق سازگار خواهد بود. اگر مستقیما SQL می‌نویسید، در مطلب «SQL Antipattern #2» کوئری‌های آن موجود است. اگر با LINQ و EF کار می‌کنید، توضیحات مطلب «مباحث تکمیلی مدل‌های خود ارجاع دهنده در EF Code first» را پیگیری کنید.
 
+ امکان اتصال دو جدول با کلید خارجی نیز در اینجا وجود دارد:
public ActionResult GetComments(JqGridRequest request, int? nodeid, int? parentid, int? n_level)
در امضای متد فوق که در بحث مطرح شده، node id تعیین کننده‌ی واکشی از parent id است. اگر node id نال بود، یعنی نمایش بار اول لیست (نمایش لیست استان‌ها):
if (nodeid == null)
{
     productsQuery = productsQuery.Where(x => x.ParentId == null);
}
 اگر نال نبود (درخواست واکشی اطلاعات استان بر اساس node id آن)، یعنی روی یک نود کلیک شده‌است. در اینجا فیلد parent id می‌تواند به عنوان کلید خارجی که به جدولی دیگر اشاره می‌کند نیز تفسیر و جایگزین شود:
else
{
   // آی دی یک گره می‌تواند کلید خارجی یک جدول دیگر باشد
   productsQuery = productsQuery.Where(x => x.ParentId == nodeid.Value);
}
برای این متد نهایتا مهم نیست که productsQuery به چه نحوی تهیه می‌شود. مهم نیست که از چند جدول مختلف حاصل می‌شود. فقط مقادیر نهایی آن مهم است.
‫۹ سال و ۱۰ ماه قبل، شنبه ۸ آذر ۱۳۹۳، ساعت ۱۸:۴۸
- مطلب فوق در همین مورد است. QueueBackgroundWorkItem به معنای در صف قرار دادن این کارها برای پردازش مجزا از هم است.
- از آن استفاده کردید؟ به چه مشکلی برخوردید؟
‫۹ سال و ۱۰ ماه قبل، شنبه ۸ آذر ۱۳۹۳، ساعت ۱۷:۱۷
مطالب گروه jqGrid را بررسی کنید. الزامی به استفاده از فرم‌های پیش فرض آن نیست. امکان inline add/edit هم دارد به همراه سفارشی سازی جزئیات آن‌ها. در مورد رویدادهای آن هم در لابلای مباحث این گروه با ارائه کدهای مرتبط، بحث شده‌است.
قبل از ارسال کدی که ملاحظه کردید، این موارد طی شدند:
- به ابتدای View مثال 4 (مثال بحث جاری که کدهای کامل آن در پایان مطلب پیوست شده‌اند) ابتدا ()Html.AntiForgeryToken@ اضافه شد.
- بعد در قسمت اسکریپت‌های صفحه، کد مرتبط با ajaxSend که توکن امنیتی را به انتهای اطلاعات درخواست اضافه می‌کند، اضافه شد.
- در کدهای کنترلر، روی اکشن متدهای ثبت، ویرایش و حذف، ویژگی ValidateAntiForgeryToken اضافه شد.
تصویر فوق هم بر همین مبنا تهیه شده‌است.
برای آزمایش بیشتر، کدهای اسکریپتی ajaxSend حذف شدند. بعد سعی در ویرایش. نتیجه دریافت استثناء از طرف سرور بود. با برگرداندن کدهای اسکریپتی، مشکل صدور استثنای نبود توکن امنیتی برطرف شد.
این روش عمومی است و با jqGrid هم امتحان شد، کار می‌کند:
        $(document).ready(function () {
            var securityToken = $('[name=__RequestVerificationToken]').val();
            $('body').bind('ajaxSend', function (elm, xhr, s) {
                if (s.type == 'POST' && typeof securityToken != 'undefined') {
                    if (s.data.length > 0) {
                        s.data += "&__RequestVerificationToken=" + encodeURIComponent(securityToken);
                    }
                    else {
                        s.data = "__RequestVerificationToken=" + encodeURIComponent(securityToken);
                    }
                }
            });
        });
در این حالت فرقی نمی‌کند که از چه ابزاری برای ارسال اطلاعات به سرور استفاده می‌کنید. همینقدر که در پشت صحنه از jQuery Ajax استفاده می‌کند، رخداد ajaxSend آن هوک شده و پارامترهای لازم، به اطلاعات ارسالی به سرور اضافه می‌شوند.
‫۹ سال و ۱۰ ماه قبل، سه‌شنبه ۴ آذر ۱۳۹۳، ساعت ۱۸:۵۸
- در حافظه.
- ولی در کل روش محاسبه‌ی sum این نیست که رکوردها را به همراه تمام ستون‌های جدول از بانک اطلاعاتی واکشی کرد و بعد در برنامه چند ستون انتخابی آن‌ها را جمع زد؛ زمانیکه خود بانک اطلاعاتی این توانایی را به نحو بهینه‌تری دارد.
‫۹ سال و ۱۰ ماه قبل، سه‌شنبه ۴ آذر ۱۳۹۳، ساعت ۰۱:۰۳
- نیازی به بازنویسی SaveChanges اصلی نیست؛ چون تعریف و پیاده سازی آن در کلاس پایه DbContext قرار دارد.
- در اینجا متد جدید SaveAllChanges تعریف شد تا بدانید اگر خواستید پیش از SaveChanges اصلی، مثلا کار اعتبارسنجی دستی را انجام دهید (برای نمونه در برنامه‌های دسکتاپ مثلا)، چگونه می‌توان به آن دسترسی داشت.
- DbContext در DataLayer قرار دارد. زمانیکه با یک ORM کار می‌کنید، خود ORM همان DataLayer شما است. لایه‌ای که از آن استفاده می‌کند (لایه سرویس)، صرفا با اینترفیس IUnitOfWork کار می‌کند و تعاریف موجود در آن و نه چیزی بیشتر از آن.
- زمانیکه با IUnitOfWork کار می‌کنید، در هیچ قسمتی از برنامه قرار نیست مستقیما new MyContext مشاهده شود. تامین این وهله صرفا از طریق تزریق وابستگی‌ها صورت می‌گیرد (کل بحث جاری یا همان پیاده سازی الگوی Context Per Request بر همین مبنا است؛ یک وهله از Context در طول یک درخواست. نه اینکه هر جایی علاقمند بودیم یک new MyContext دستی نوشته شود).
‫۹ سال و ۱۰ ماه قبل، سه‌شنبه ۴ آذر ۱۳۹۳، ساعت ۰۰:۰۱
چون نام متد آن SaveAllChanges است و با نام متد کلاس پایه یکی نیست.