بازخوردهای پروژه‌ها
طراحی رابط کاربری - راهنمایی فنی
سلام و عرض تشکر
از دیروز دارم از این پروفایلر استفاده میکنم. عالی و بدون دردسر.
واقعا لذت بردم و چندجا از برنامه م رو بهبود دادم با این ابزار.
- سوالی داشتم در مورد تگ پیش پردازنده ای که توی کانفیگ برنامه اضافه میکنیم. آیا این تگ برای انتشار نهایی باید دستی پاک بشه؟ آیا مشکل کارایی رخ نمیده؟ آیا اساسا در مورد برنامه‌های وبی که روی هاست منتشر میکنیم، لاگ کردن با پروفایلر ارزش افزوده ای داره؟
- در مورد رابط کاربری، برام خیلی گنگ بود. مخصوصا اسکرول‌های تودرتو کار مرور اطلاعات رو واقعا مشکل میکرد. نرم افزار مشابه Entity Framework Profiler 3.0  رو که نگاه میکردم، از لحاظ بصری و پیدا کردن مطلب خیلی راحت‌تر بود. البته نرم افزار شما رایگان هست و این صرفا یک بازخورد در جهت بهبود و نه یک انتظار می‌باشد. با تشکر بسیار
بازخوردهای پروژه‌ها
درخواست راهنمایی بیشتر
با سلام، خیلی ممنون که سورس این وب اپلیکیشن را در اختیار کاربران قرار داده اید؛
بنده با مطالعه (بخشی از) این مطالب: 
مسیر راه Entity framework code-first ، 
مسیر راه ASP.NET MVC ،
بررسی مفاهیم معکوس سازی وابستگی‌ها و ابزارهای مرتبط با آن ،
AutoMapper ،
چک لیست تهیه یک برنامه ASP.NET MVC ،
تا حد زیاد نحوه پیاده سازی back end پروژه را درک کردم (البته ابتدا پروژه فروشگاه اینترنتی شهر طلایی من که ساده‌تر است را بررسی کردم).
با این وجود بخش هایی از پروژه از نظر بنده همچنان پیچیده است!
- مدیریت کاربران، نقش‌ها و تعیین دسترسی ها؛
- نحوه لاگ کردن فعالیت ها؛
- ارسال و دریافت پیام؛
- نحوه پیاده‌سازی front end پروژه (به طور خاص)،
لطفا در صورت امکان در این موارد (به ویژه مورد آخر طراحی UI) اگر منبعی یا مسیر راهی وجود دارد، معرفی نمایید.
با تشکر،  
نظرات مطالب
پَرباد - آموزش پیاده‌سازی پرداخت آنلاین در دات نت - تنظیمات
روش بهینه سازی شده تنظیم پایگاه داده در نسخه ۲.۱.۰

Database Initializer

Database Initializer همانطور که از نامش پیداست، به شما کمک می‌کند پایگاه داده پَرباد را به هر صورتیکه در نظر دارید راه اندازی کنید.

هدف از افزودن Database Initializer ها

از آنجایی که Entity Framework، پایگاه‌های داده زیادی را پشتیبانی می‌کند و هر کدام از آنها دارای شرایط، ویژگی‌ها و محدودیت های خاص خود هستند، شما می‌توانید پایگاه داده مورد نظر خود را آنطور که در نظر دارید ایجاد کنید. برای مثال پایگاه داده Sqlite طبق اعلام خود تیم Entity Framework دارای محدودیت‌هایی برای Migration است. به همین دلیل این پایگاه داده را نمی‌توان مانند SQL Server به راحتی Migrate کرد.

مواردی که توسط Database Initializer‌ها قابل استفاده هستند شامل:

  • Create Database
  • Delete Database
  • Migrate Database
  • Seed Database

نمونه مثال جهت تنظیم پایگاه داده به روش جدید:
services.AddParbad()
           .ConfigureDatabase(builder =>
           {
              // Choose your database provider (SQL Server, MySql, Sqlite, etc.)
              builder.Use....
           })
           .ConfigureDatabaseInitializer(builder =>
           {
              builder.UseInitializer(async context =>
              {
                  await context.Database.EnsureDeletedAsync();

                  // OR
                  await context.Database.EnsureCreatedAsync();

                  // OR
                  await context.Database.MigrateAsync();
              });
           });

در مثال بالا ابتدا در متد ConfigureDatabase نوع پایگاه داده مورد نظر خود را مشخص می‌کنیم.
سپس در متد ConfigureDatabaseInitializer تعیین می‌کنیم که پایگاه داده به چه صورتی باید ایجاد شود. همانطور که مشاهده می‌کنید، شما می‌توانید پایگاه داده را حذف، ایجاد و یا Migrate کنید.

همچنین جهت نوشتن راحتتر تنظیمات، متدهایی برای ایجاد، حذف و Migrate محیا شده که می‌توانید مانند زیر از آنها استفاده کنید:
services.AddParbad()
           .ConfigureDatabase(builder =>
           {
              // Choose your Entity Framework provider (SQL Server, MySql, Sqlite, etc.)
              builder.Use....
           })
           .ConfigureDatabaseInitializer(builder =>
           {
              builder.CreateDatabase();

              // OR
              builder.DeleteAndCreateDatabase();

              // OR
              builder.CreateAndMigrateDatabase();
           });

نکته ۱: اگر هیچکدام از متد‌های کمکی بالا برای شما مناسب نیستند، از همان روش اول یعنی UseInitializer استفاده کنید.
نکته ۲: Database Initializer ها، به همان ترتیبی که اضافه شده‌اند، اجرا خواهند شد.
نکته ۳: جهت سادگی در Migrate کردن پایگاه داده، در هنگام تنظیم پایگاه داده مورد نظر خود می‌توانید از متد UseParbadMigrations استفاده کنید.
مثال:
services.AddParbad()
           .ConfigureDatabase(builder =>
           {
              // SQL Server
              builder.UseSqlServer("Connection String", options => options.UseParbadMigrations());
           })
           .ConfigureDatabaseInitializer(builder =>
           {
              builder.CreateAndMigrateDatabase();
           });

متد UseParbadMigrations معادل متد زیر است:
builder.UseSqlServer("Connection String", options => options.MigrationsAssembly("Parbad"));


نمونه مثال‌ها را همچنین می‌توانید در صفحه GitHub پروژه مشاهده کنید. 
مطالب
درج یک باره چندین رکورد بصورت همزمان هنگام استفاده از ORMها
همونطور که میدونیم درج یکباره چندین رکورد هنگام استفاده از Entity Framework فعلا امکان پذیر نیست و باید از یک حلقه استفاده کرد و آنها رو یک به یک وارد کرد که هنگامی تعداد رکوردها زیاد باشن زمان اجرا یکم زیاد میشه. برای رفع این مشکل در EF Code First میتونین خاصیت AutoDetectChangesEnabled رو برای Context غیرفعال کنید که استفاده از این روش قبلا در این مقاله توضیح داده شده است. راه دیگه استفاده از SqlBulkCopy هست که میتوانید هنگام استفاده از ORMها ازش استفاده کنید. اگه قبلا از ADO.NET استفاده کرده باشید و خواسته باشید تعداد زیادی رکورد رو بصورت همزمان وارد دیتابیس کنید حتما با SqlBulkCopy آشنایی دارید.

فرض کنید دارید در پروژه، از Entity Framework استفاده میکنید و یک مدل با نام Person دارید که تعریفش به صورت زیر است 

public class Person
{
     public int PersonId { get; set; }

     public string Name { get; set; }
}

حالا میخوایم تعداد ٥٠٠٠ رکورد از Person رو یکجا وارد دیتابیس کنیم. برای استفاده از SqlBulkCopy، روش به این شکل هست که ابتدا یکDataTable  ایجاد میکنیم. سپس ستونهای متناظر با جدول Person رو با استفاده از DataColumn ایجاد میکنیم و DataColumnهای ایجاد شده رو به DataTable اضافه میکنیم و سپس اطلاعات رو وارد DataTable میکنیم و اون رو با استفاده از SqlBulkCopy وارد دیتابیس میکنیم که این روش یکم وقتگیر و خسته کننده است. 

راه آسانتر استفاده از یک کتابخانه با نام EntityDataReader هست که توسط مایکروسافت نوشته شده که دیگه نیازی به ساختنDataTable  نیست و این کتابخانه کارهای لازم رو خودش انجام میده. در پروژەتون یک کلاس با نامEntityDataReader ایجاد کنید و سورس مربوط این کلاس رو از اینجا copy و در داخل کلاس paste کنید. 

حالا یک لیست از Pesron با نام personList ایجاد مینماییم و با استفاده از یک حلقه تعداد ٥٠٠٠ تا نمونه از Person ایجاد و به لیست اضافه میکنیم.

var personList = new List<Person>();
for (var i = 0; i < 5000; i++)
{
    var person = new Person
        {
            Name = "John Doe",
        };
}

در ادامه برای استفاده از SqlBulkCopy نیاز به ConnectionString و نام جدول متناظر با کلاس Person در دیتابیس داریم.

اگر از پروژ وب استفاده میکنید میتونید با این خط کد ConnectionString رو که در فایل web.config ذخیره شده است بروگردونید که در اینجا DataConnection نام ConnectionString ذخیره شده در web.config هست.

var connectionString = ConfigurationManager.ConnectionStrings["DataConnection"].ConnectionString;

اگر از EF Code First استفاده میکنید و در تنظیمات Context خاصیت PluralizingTableNameConvention رو حذف کردیدەاید نام جدول dbo.Person هست و در غیر اینصورت db.People هست.

و در ادامه داریم:   

var connectionString = ConfigurationManager.ConnectionStrings["DataConnection"].ConnectionString;
var bulkCopy = new SqlBulkCopy(connectionString) { DestinationTableName = "dbo.Person" };
bulkCopy.WriteToServer(personList.AsDataReader()  );

سرعت این روش بسیار بالاست و برای درجهای با تعداد بالا بهینه است.

برای ویرایش و حذف چندین رکورد بصورت همزمان متیونید از کتابخانه Entity Framework Extended Library استفاده کنید که امکانات دیگری هم داره و از طریق nuget هم قابل نصب است.

مطالب
نحوه‌ی مشاهده‌ی خروجی SQL تولید شده توسط WCF RIA Services

این روزها با وجود ORMs ، کوئری SQL‌ نوشتن شبیه به دورانی شده که با وجود زبان‌های سطح بالا، عده‌ای علاقمند هستند با استفاده از زبان اسمبلی برنامه نویسی کنند! WCF RIA Services به صورت پیش فرض از entity framework استفاده می‌کند (هر چند می‌توان از سایر ORMs هم استفاده کرد)، بنابراین عنوان صحیح‌تر بحث این خواهد بود: چگونه خروجی SQL تولید شده توسط Entity framework را بررسی کنیم؟

الف) استفاده از SQL Server profiler
اولین برنامه‌ای که از سال‌ها قبل، حتی پیش از ظهور ORMs وجود داشته، برنامه‌ی SQL server profiler است، که عموما در مسیر ذیل قابل دستیابی است:
Start Menu->Programs->Microsoft SQL Server 2008->Performance Tools->SQL Server profiler



نکته مهم:
حین کار با SQL Server profiler ، ممکن است انبوهی از کوئری‌های دیگر مثلا مرتبط با SQL Server agent یا reporting services و غیره نیز لاگ شوند. اما الان ما تنها به کوئری‌های برنامه‌ی خود نیاز داریم. برای این منظور به کانکشن استرینگ خود، گزینه‌ی Application Name=My Application Name را نیز اضافه کنید:

<connectionStrings>
<add name="dmEntities" connectionString="metadata=res://*/Models.dmDataModel.csdl|res://*/Models.dmDataModel.ssdl|res://*/Models.dmDataModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=(local);Initial Catalog=dm;Integrated Security=True;Application Name=My Application Name;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>

اکنون اگر برنامه را با پروفایلر مورد بررسی قرار دهید خروجی به صورت زیر خواهد بود:



برای فیلتر کردن Application Name مورد نظر، در ابتدای کار که یک سشن جدید را آغاز می‌کنید به برگه‌ی events selection مراجعه کرده و بر روی دکمه‌ی column filter کلیک کنید. گزینه‌ی application name را در صفحه‌ی باز شده انتخاب نموده و در قسمت Like آن مطابق تصویر زیر ، نام برنامه‌ی خود را وارد نمائید:




ب) استفاده از IntelliTrace در VS.NET 2010
برنامه را در حالت دیباگ در VS.NET 2010 اجرا کنید. در هر لحظه‌ای می‌توان روی گزینه‌ی Break all کلیک کرد و خروجی SQL تولید شده را نیز علاوه بر اطلاعات دیگر مشاهده نمود:




ج) استفاده از برنامه‌ی حرفه‌ای entity framework profiler
این برنامه از هر دو مورد قبل کاملتر بوده و اساسا برای لاگ کردن کوئری‌ها، مدت زمان اجرا، گزارشگیری از وضعیت برنامه، کدامیک از کوئری‌ها سنگین‌تر هستند، حتی از طریق کدام متد فراخوانی شده‌اند، ارائه‌ی گزارشات و راهنمایی‌هایی در مورد چگونگی بهبود کارآیی برنامه‌ی تهیه شده و امثال آن کاربرد دارد.



استفاده از آن هم بسیار ساده است. ابتدا ارجاعی را به اسمبلی HibernatingRhinos.Profiler.Appender.v4.0 به پروژه‌ی ASP.NET خود اضافه کنید (همان پروژه‌ی هوست مربوط به WCF RIA Service ما). سپس به فایل Global.asax.cs برنامه مراجعه کرده و یک سطر ذیل را اضافه کنید:

protected void Application_Start(object sender, EventArgs e)
{
HibernatingRhinos.Profiler.Appender.EntityFramework.EntityFrameworkProfiler.Initialize();
}

از این پس تنها کافی است برنامه‌ی پروفایلر در حال اجرا بوده و برنامه شما نیز اجرا شود. کلیه‌ی تبادلات با دیتابیس لاگ خواهند شد.

اشتراک‌ها
ساخت اولین پروژه WebAPI با MVC 6
Previous versions of ASP.NET included the Web API framework for creating web APIs. In ASP.NET 5, this functionality has been merged into the MVC 6 framework. Unifying the two frameworks makes it simpler to build apps that include both UI (HTML) and APIs, because now they share the same code base and pipeline. 
ساخت اولین پروژه WebAPI با MVC 6
نظرات مطالب
آشنایی با NHibernate - قسمت اول
درباره entity های ماکروسافت هم اگر امکانش هست بنویسید.
فناوری های LINQ to entity و ADO.net entity
برای کسی که فقط با MSSQL کار میکند،آیا فناوری های بالا کمبودی نسبت به NHibernate دارند؟
منظور از هاست های medium trust چیست،یعنی ORM ها را نمی توان روی آنها اجرا کرد؟

-;{@