نظرات مطالب
EF Code First #1
- نکته مهم: اگر از طریق management studio بانک اطلاعاتی مدنظر را باز کرده‌اید، برنامه امکان کارکردن با آن‌را جهت اعمال migrations ندارد. اتصال خودتان را قطع کنید و بعد امتحان کنید.
- در صفحه تعریف لاگین جدید در SQL Server روی دکمه‌ی جستجو کلیک نکنید. این کاربر را تشخیص نمی‌دهد. به همین نحوی که عنوان شده، آن‌را وارد کنید و تائید کنید؛ کار می‌کند.
- در این رشته‌ی اتصالی که نوشتید، به نظر یک «;» فراموش شده‌است:
Server=. Database=kashanSchools;Trusted_Connection=True;
بعد از دات، یک ; نیاز است.
- این رشته را هم امتحان کنید:
Data Source=(local);Initial Catalog=kashanSchools;Integrated Security = true
مطالب
تهیه خروجی XML از یک بانک اطلاعاتی، توسط EF Code first
نگارش کامل SQL Server امکان تهیه خروجی XML از یک بانک اطلاعاتی را دارد. اما اگر بخواهیم از سایر بانک‌های اطلاعاتی که چنین توابع توکاری ندارند، استفاده کنیم چطور؟ برای تهیه خروجی XML توسط Entity framework و مستقل از نوع بانک اطلاعاتی در حال استفاده، حداقل دو روش وجود دارد:

الف) استفاده از امکانات Serialization توکار دات نت

using System.IO;
using System.Xml;
using System.Xml.Serialization;

namespace DNTViewer.Common.Toolkit
{
    public static class Serializer
    {
        public static string Serialize<T>(T type)
        {
            var serializer = new XmlSerializer(type.GetType());
            using (var stream = new MemoryStream())
            {
                serializer.Serialize(stream, type);
                stream.Seek(0, SeekOrigin.Begin);
                using (var reader = new StreamReader(stream))
                {
                    return reader.ReadToEnd();
                }
            }
        }
    }
}
در اینجا برای نمونه، لیستی از اشیاء مدنظر خود را تهیه کرده و به متد Serialize فوق ارسال کنید. نتیجه کار، تهیه معادل XML آن است.
امکانات سفارشی سازی محدودی نیز برای XmlSerializer درنظر گرفته شده است؛ برای نمونه قرار دادن ویژگی‌هایی مانند XmlIgnore بالای خواصی که نیازی به حضور آن‌ها در خروجی نهایی XML نمی‌باشد.


ب) استفاده از امکانات LINQ to XML دات نت

روش فوق بدون مشکل کار می‌کند، اما اگر بخواهیم قسمت Reflection خودکار ثانویه آن‌را (برای نمونه جهت استخراج مقادیر از لیست دریافتی) حذف کنیم، می‌توان از LINQ to XML استفاده کرد که قابلیت سفارشی سازی بیشتری را نیز در اختیار ما قرار می‌دهد (کاری که در سایت جاری برای تهیه خروجی XML از بانک اطلاعاتی آن انجام می‌شود).

        private string createXmlFile(string dir)
        {
            var xLinq = new XElement("ArrayOfPost",
                        _blogPosts
                            .AsNoTracking()
                            .Include(x => x.Comments)
                            .Include(x => x.User)
                            .Include(x => x.Tags)
                            .OrderBy(x => x.Id)
                            .ToList()
                            .Select(x => new XElement("Post", postXElement(x)))
                            );

            var xmlFile = Path.Combine(dir, "dot-net-tips-database.xml");
            xLinq.Save(xmlFile);
            return xmlFile;
        }

        private static XElement[] postXElement(BlogPost x)
        {
            return new XElement[]
            {
                new XElement("Id", x.Id),
                new XElement("Title", x.Title),
                new XElement("Body", x.Body),
                new XElement("CreatedOn", x.CreatedOn),
                tagElement(x),
                new XElement("User",
                                new XElement("Id", x.UserId.Value),
                                new XElement("FriendlyName", x.User.FriendlyName))
            }.Where(item => item != null).ToArray();
        }

        private static XElement tagElement(BlogPost x)
        {
            var tags = x.Tags.Any() ?
                            x.Tags.Select(y =>
                                        new XElement("Tag",
                                                new XElement("Id", y.Id),
                                                new XElement("Name", y.Name)))
                                  .ToArray() : null;
            if (tags == null)
                return null;

            return new XElement("Tags", tags);
        }
خلاصه‌ای از نحوه تبدیل اطلاعات لیستی از مطالب را به معادل XML آن در کدهای فوق مشاهده می‌کنید. یک سری نکات ریز نیز باید در اینجا رعایت شوند:
1) کار با یک new XElement که دارای متد Save با فرمت XML نیز هست، شروع می‌شود. مقدار آن‌را مساوی یک کوئری از بانک اطلاعاتی قرار می‌دهیم. این کوئری چون قرار است تنها اطلاعاتی را از بانک اطلاعاتی دریافت کند و نیازی به تغییر در آن‌ها نیست، با استفاده از متد AsNoTracking، حالت فقط خواندنی پیدا کرده است.
2) اطلاعاتی را که نیاز است در فایل نهایی XML وجود داشته باشند، تنها کافی است در قسمت Select این کوئری با فرمت new XElement‌های تو در تو قرار دهیم. به این ترتیب قسمت Relection خودکار XmlSerializer روش مطرح شده در ابتدای بحث دیگر وجود نداشته و عملیات نهایی بسیار سریعتر خواهد بود.
3) چون در این حالت، کار انجام شده دستی است، باید نام‌های گره‌های صحیحی را انتخاب کنیم تا اگر قرار است توسط همان XmlSerializer مجددا کار serializer.Deserialize صورت گیرد، عملیات با شکست مواجه نشود. بهترین کار برای کم شدن سعی و خطاها، تهیه یک لیست اطلاعات آزمایشی و سپس ارسال آن به روش ابتدای بحث است. سپس می‌توان با بررسی خروجی آن مثلا دریافت که روش serializer.Deserialize به صورت پیش فرض به دنبال ریشه‌ای به نام ArrayOfPost برای دریافت لیستی از مطالب می‌گردد و نه Posts یا هر نام دیگری.
4) در کوئری LINQ to Entites نوشته شده، پیش از Select، یک ToList قرار دارد. متاسفانه EF اجازه استفاده مستقیم از Select هایی از نوع XElement را نمی‌دهد و باید ابتدا اطلاعات را تبدیل به LINQ to Objects کرد.
5) در حین تهیه XElement‌ها اگر قرار است عنصری نال باشد، باید آن‌را در خروجی نهایی ذکر نکرد. به این ترتیب serializer.Deserialize بدون نیاز به تنظیمات اضافه‌تری بدون مشکل کار خواهد کرد. در غیراینصورت باید وارد مباحثی مانند تعریف یک فضای نام جدید برای خروجی XML به نام XSI رفت و سپس به کمک ویژگی‌ها، xsi:nil را به true مقدار دهی کرد. اما همانطور که در متد postXElement ملاحظه می‌کنید، برای وارد نشدن به مبحث فضای نام xsi، مواردی که null بوده‌اند، اصلا در آرایه نهایی ظاهر نمی‌شوند و نهایتا در خروجی، حضور نخواهند داشت. به این ترتیب متد ذیل، بدون مشکل و بدون نیاز به تنظیمات اضافه‌تری قادر است فایل XML نهایی را تبدیل به معادل اشیاء دات نتی آن کند.

using System.IO;
using System.Xml;
using System.Xml.Serialization;

namespace DNTViewer.Common.Toolkit
{
    public static class Serializer
    {
        public static T DeserializePath<T>(string xmlAddress)
        {
            using (var xmlReader = new XmlTextReader(xmlAddress))
                {
                    var serializer = new XmlSerializer(typeof(T));
                    return (T)serializer.Deserialize(xmlReader);
                }
        }
    }
}
نظرات مطالب
مبانی TypeScript؛ تنظیمات TypeScript در ویژوال استودیو
یک نکته: یافتن شماره نگارش کامپایلر TypeScript در حال استفاده‌ی توسط ویژوال استودیو
الف) package manager console را باز کنید و سپس دستور tsc -v را صادر کنید.
ب) فایل پروژه (csproj) را باز کرده و مدخل TypeScriptToolsVersion آن‌را بررسی کنید. این شماره نگارش مقدم است بر عددی که با tsc -v مشاهده می‌کنید.
مطالب
لینک‌های هفته‌ی سوم بهمن

وبلاگ‌ها ، سایت‌ها و مقالات ایرانی (داخل و خارج از ایران)

Visual Studio

ASP. Net


طراحی و توسعه وب

PHP

اس‌کیوال سرور

سی شارپ

عمومی دات نت

ویندوز

مسایل اجتماعی و انسانی برنامه نویسی

متفرقه
نظرات نظرسنجی‌ها
به عنوان توسعه دهنده اندرویدی چه گوشی را انتخاب می کنید؟
دلیل انتخاب  رو میتونم بروز رسانی‌های به موقع گوگل ، سخت افزار مناسب در کنار قیمت مناسب ( البته به پای سامسونگ نمیرسه )
امکانات ساده‌تر برای تعویض  سیستم عامل مثلن راحتی باز کردن بوتلودر و ... حتی برای نکسوس‌ها یه نرم افزار هم موجود بود که رام رو ویزاردی عوض میکردیم  ، این گونه مسائل رو ندیدم داخل vendor‌های دیگه البته ادعایی ندارم چونکه زیاد جستجویی نداشتم
نظرات مطالب
شروع به کار با AngularJS 2.0 و TypeScript - قسمت هشتم - دریافت اطلاعات از سرور
- سمت سرور آن مهم نیست (اگر آدرس آن‌را که مستقیما باز می‌کنید، خروجی JSON را مشاهده می‌کنید).
- هر زمانیکه خطای syntax error را دریافت کردید یعنی تنظیمات ابتدایی AngularJS 2.0 شما اشتباه و یا ناقص است.
- این مطالب به روز شده‌اند. نیاز هست توضیحات ذیل هر مطلب را جهت به روز رسانی هر قسمت دنبال کنید.
- و یا ... تمام این توضیحات به صورت یکجا به پروژه‌ی « MVC5Angular2 » اعمال شده‌اند. نیاز است فایل به فایل و سطر به سطر کدهای خود را با این پروژه تطبیق دهید.
نظرات مطالب
شروع به کار با AngularJS 2.0 و TypeScript - قسمت هشتم - دریافت اطلاعات از سرور
چند نکته‌ی تکمیلی
- اگر با به روز رسانی وابستگی‌ها، خطای «Invalid module name in augmentation, module '../../Observable' cannot be found» را دریافت کردید، چند نگارش پایین‌تر rxjs را نیز امتحان کنید.
به علاوه مطمئن شوید که تعاریف typings مناسب را در فایل main.ts ذکر کرده‌اید:
/// <reference path="../typings/es6-shim.d.ts" />

import { bootstrap } from '@angular/platform-browser-dynamic';
- با تغییرات نگارش RC، دیگر نیازی به ذکر http.dev.js در فایل index.html نیست. این مدخل به صورت خودکار توسط systemjs.config.js اضافه می‌شود:
 <script src="~/systemjs.config.js"></script>