- فعال کردن خاصیت Contained Databases
قبل از استفاده از Contained Databases می بایست این امکان را فعال کرد. برای این کار میتوانید از SQL Server Management Studio یا T-SQL commands استفاده نمایید. بر روی نام Instance راست کلیت کنید و گزینه Properties را انتخاب نمایید. از گزینه Advanced که در شکل زیر مشاهده مینمایید خاصیت Enable Contained Databases را بر روی True قرار دهید.
یا میتوایند از sp_configure این کار را انجام دهید.دستورات زیر این موضوع را نشان میدهد.
sp_configure 'show advanced options',1 GO RECONFIGURE WITH OVERRIDE GO sp_configure 'contained database authentication',1 GO RECONFIGURE WITH OVERRIDE GO
- ایجاد یا تغییر یک پایگاه داده از نوع Contained Databases
برای ایجاد یک پایگاه داده با این خاصیت یا تغییر پایگاه داده موجود کافیست مقدار گزینه Containment type را بر روی Partial قرار دهید. برای پایگاه داده موجود از پنجره Properties پایگاه داده صفحه Options را انتخاب کنید.
- ایجاد یک کاربر برای پایگاه داده Contained Databases
برای تعریف یک کاربر در سطح پایگاه داده پوشه Security پایگاه داده خود را باز کنید بر روی پوشه Users راست کیلک و گزینه New User را انتخاب نمایید از گزینه User type که در شکل زیر نشان داده شده است SQL user with password را انتخاب نمایید و نام کاربر و رمز عبور و تکرار آن را وارد نمایید. کاربر ایجاد شده در سطح پایگاه داده میباشد و با انتقال به سرور دیگر نیر قابل دسترسی میباشد.
- اتصال به پایگاه داده Contained Databases
برای اتصال به پایگاه داده کافیست در حالت SQL Server Authentication نام کاربری و رمز عبور جدید را وارد و گزینه Options را انتخاب و از برگه Additional Connection Parameters نام پایگاه داده مورد نظر را مانند شکل زیر وارد نمایید پس از ورود تنها پایگاه داده خود را مشاهده مینمایید. یکی از کاربرهای این قابلیت برای مدیران سرور پایگاه داده میباشد که بدون استفاده از مجوز sysadmin به کاربران اجازه دسترسی را میدهد.
دریافت کتاب Pro ASP.NET MVC 5
Automated Software Testing Series - Visual Studio Toolbox
12 videos
Welcome to the 12-part series on automated software testing, where you will learn how to increase the efficiency and ROI of your software testing. We cover unit testing, behavior style testing, mocking, integration testing and more.
10 مرحله برای یادگیری پرسرعت هر چیزی
To Every Programmer Who’s Ever Scanned
Hacker News And /r/programming And Thought...
“How Will I Ever Keep Up?”
Here’s How To Turn “Information Overwhelm”
Into An Efficiency Edge That Can
Quickly Boost Your Income,
Earn You “MVP” Status With Your Team,
And Make You The In-Demand Developer
Companies Are Dying To Recruit
به صورت پیش فرض تنظیمات حافظهی اس کیوال سرور به صورتی است که به آن اجازه میدهد تمامی حافظهی مهیای سیستم عامل را مصرف کند! اگر شخصی با این مساله آشنایی نداشته باشد احتمالا تصور خواهد کرد که اس کیوال سرور نشتی حافظه دارد یا کلا مشکلی در سیستم روی داده است که تا این حد مصرف حافظه بالا رفته است.
برای مشاهدهی این تنظیمات روی instance سرور مورد نظر کلیک راست کرده و گزینه خواص را انتخاب کنید. سپس در صفحهی باز شده گزینه memory را مشاهده نمائید.
البته اینکار را با استفاده از دستورات T-SQL هم میتوان انجام داد:
EXEC sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE
EXEC sp_configure 'max server memory (MB)'
EXEC sp_configure 'show advanced options', 0
RECONFIGURE WITH OVERRIDE
که البته عمدا آنرا بر روی یک گیگ تنظیم کردهام تا عملکرد سیستم مختل نشود. (چون اگر غیر از این باشد، تعارفی نداشته و هر آنچه را که صلاح بداند مصرف میکند!)
کمی در بلاگهای رسمی برنامه نویسهای اس کیوال سرور در سایت MSDN در اینباره جستجو کردم و نتیجه آن به صورت زیر است:
تنظیمات حداکثر حافظهی مصرفی اس کیوال سرورهای 2005 و 2008
برای یک سیستم عامل 64 بیتی:
Physical RAM | MaxMem Setting |
2GB | 1500 |
4GB | 3200 |
6GB | 4800 |
8GB | 6700 |
12GB | 10600 |
16GB | 14500 |
24GB | 22400 |
32GB | 30000 |
48GB | 45000 |
64GB | 59000 |
برای سروری 32 بیتی این اعداد حداکثر را تقریبا منهای 300 مگابایت نمائید. (و البته همانطور که مطلع هستید در سیستم عاملهای سرور 32 بیتی، اگر بیشتر از 2 گیگا بایت رم داشتید سوئیچ 3GB و اگر بیشتر از 4 گیگابایت رم مهیا بود، سوئیچ PAE باید در boot.ini تنظیم شوند. در غیر اینصورت هزینهی سخت افزاری بیهودهای را متحمل شدهاید، زیرا استفادهی بهینهای از آن در یک سیستم عامل 32 بیتی نخواهد شد)
و این اعداد را همانطور که ذکر شد، در تنظیمات سرور میتوان وارد نمود ( از طریق management studio ) و یا با استفاده از دستورات T-SQL نیز این امر میسر است: (در مثال زیر حداکثر حافظه مجاز مصرفی به 2300 مگابایت تنظیم میشود)
EXEC sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE
EXEC sp_configure 'max server memory (MB)', 2300
EXEC sp_configure 'show advanced options', 0
RECONFIGURE WITH OVERRIDE
برای مطالعهی بیشتر
http://sqlnerd.blogspot.com/2006/07/memory-use-in-sql-server.html
http://blogs.msdn.com/axperf/archive/2008/03/10/welcome-database-configuration-checklist-part-1.aspx
http://technet.microsoft.com/en-us/library/bb124810.aspx
enable-migrations add-migration Initial -IgnoreChanges update-database
سؤال: چگونه میتوان همین عملیات را با کدنویسی انجام داد؟
متد UpdateDatabase کلاس ذیل، دقیقا معادل است با اجرای سه دستور فوق :
using System.Data.Entity.Migrations; using System.Data.Entity.Migrations.Design; namespace EFTests { /// <summary> /// Using Entity Framework Code First with an existing database. /// </summary> public static class CreateMigrationHistory { /// <summary> /// Creates a new '__MigrationHistory' table. /// Enables migrations using Entity Framework Code First on an existing database. /// </summary> public static void UpdateDatabase(DbMigrationsConfiguration configuration) { var scaffolder = new MigrationScaffolder(configuration); // Creates an empty migration, so that the future migrations will start from the current state of your database. var scaffoldedMigration = scaffolder.Scaffold("IgnoreChanges", ignoreChanges: true); // enable-migrations // add-migration Initial -IgnoreChanges configuration.MigrationsAssembly = new MigrationCompiler(ProgrammingLanguage.CSharp.ToString()) .Compile(configuration.MigrationsNamespace, scaffoldedMigration); // update-database var dbMigrator = new DbMigrator(configuration); dbMigrator.Update(); } } }
MigrationScaffolder کار تولید خودکار کلاسهای cs مهاجرتهای EF را انجام میدهد. زمانیکه به متد Scaffold آن پارامتر ignoreChanges: true ارسال شود، کلاس مهاجرتی را ایجاد میکند که خالی است (متدهای up و down آن خالی تشکیل میشوند). سپس این کلاسها کامپایل شده و در حین اجرای برنامه مورد استفاده قرار میگیرند.
برای استفاده از آن، نیاز به کلاس MigrationCompiler خواهید داشت. این کلاس در مجموعه آزمونهای واحد EF به عنوان یک کلاس کمکی وجود دارد: MigrationCompiler.cs
صرفا جهت تکمیل بحث و همچنین سهولت ارجاعات آتی، کدهای آن در ذیل نیز ذکر خواهد شد:
using System; using System.CodeDom.Compiler; using System.Collections.Generic; using System.ComponentModel; using System.Data.Common; using System.Data.Entity; using System.Data.Entity.Migrations; using System.Data.Entity.Migrations.Design; using System.Data.Entity.Spatial; using System.IO; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Resources; using System.Text; namespace EF_General.Models.Ex22 { public enum ProgrammingLanguage { CSharp, VB } public class MigrationCompiler { private readonly CodeDomProvider _codeProvider; public MigrationCompiler(string language) { _codeProvider = CodeDomProvider.CreateProvider(language); } public Assembly Compile(string @namespace, params ScaffoldedMigration[] scaffoldedMigrations) { var options = new CompilerParameters { GenerateExecutable = false, GenerateInMemory = true }; options.ReferencedAssemblies.Add(typeof(string).Assembly.Location); options.ReferencedAssemblies.Add(typeof(Expression).Assembly.Location); options.ReferencedAssemblies.Add(typeof(DbMigrator).Assembly.Location); options.ReferencedAssemblies.Add(typeof(DbContext).Assembly.Location); options.ReferencedAssemblies.Add(typeof(DbConnection).Assembly.Location); options.ReferencedAssemblies.Add(typeof(Component).Assembly.Location); options.ReferencedAssemblies.Add(typeof(MigrationCompiler).Assembly.Location); options.ReferencedAssemblies.Add(typeof(DbGeography).Assembly.Location); var embededResources = GenerateEmbeddedResources(scaffoldedMigrations, @namespace); foreach (var resource in embededResources) options.EmbeddedResources.Add(resource); var sources = scaffoldedMigrations.SelectMany(g => new[] { g.UserCode, g.DesignerCode }); var compilerResults = _codeProvider.CompileAssemblyFromSource(options, sources.ToArray()); foreach (var resource in embededResources) File.Delete(resource); if (compilerResults.Errors.Count > 0) { throw new InvalidOperationException(BuildCompileErrorMessage(compilerResults.Errors)); } return compilerResults.CompiledAssembly; } private static string BuildCompileErrorMessage(CompilerErrorCollection errors) { var stringBuilder = new StringBuilder(); foreach (CompilerError error in errors) { stringBuilder.AppendLine(error.ToString()); } return stringBuilder.ToString(); } private static IEnumerable<string> GenerateEmbeddedResources(IEnumerable<ScaffoldedMigration> scaffoldedMigrations, string @namespace) { foreach (var scaffoldedMigration in scaffoldedMigrations) { var className = GetClassName(scaffoldedMigration.MigrationId); var embededResource = Path.Combine( Path.GetTempPath(), @namespace + "." + className + ".resources"); using (var writer = new ResourceWriter(embededResource)) { foreach (var resource in scaffoldedMigration.Resources) writer.AddResource(resource.Key, resource.Value); } yield return embededResource; } } private static string GetClassName(string migrationId) { return migrationId .Split(new[] { '_' }, 2) .Last() .Replace(" ", string.Empty); } } }
استفاده از این کلاسها نیز بسیار ساده است. یکبار دستور ذیل را در ابتدای کار برنامه فراخوانی کنید تا جدول MigrationHistory دوباره ساخته شود:
CreateMigrationHistory.UpdateDatabase(new Configuration());
public class Configuration : DbMigrationsConfiguration<MyContext> { public Configuration() { AutomaticMigrationsEnabled = true; AutomaticMigrationDataLossAllowed = true; } }
استفاده از Froala WYSIWYG Editor در ASP.NET
buttons: [ // .... , "insertHTML" //custom button ], customButtons: { insertHTML: { title: 'Insert Code', icon: { type: 'font', value: 'fa fa-dollar' // Font Awesome icon class fa fa-* }, callback: function (editor) { editor.saveSelection(); var codeModal = $("<div>").addClass("froala-modal").appendTo("body"); var wrapper = $("<div>").addClass("f-modal-wrapper").appendTo(codeModal); $("<h4>").append('<span data-text="true">Insert Code</span>') .append($('<i class="fa fa-times" title="Cancel">') .click(function () { codeModal.remove(); })) .appendTo(wrapper); var dialog = "<textarea id='code_area' style='height: 211px; width: 538px;' /><br/><label>Language:</label><select id='code_lang'><option>CSharp</option><option>VB</option><option>JScript</option><option>Sql</option><option>XML</option><option>CSS</option><option>Java</option><option>Delphi</option></select> <input type='button' name='insert' id='insert_btn' value='Insert' /><br/>"; $(dialog).appendTo(wrapper); $("#code_area").text(editor.text()); if (!editor.selectionInEditor()) { editor.$element.focus(); } $('#insert_btn').click(function () { var lang = $("#code_lang").val(); var code = $("#code_area").val(); code = code.replace(/\s+$/, ""); // rtrim code = $('<span/>').text(code).html(); // encode var htmlCode = "<pre language='" + lang + "' name='code'>" + code + "</pre></div>"; var codeBlock = "<div align='left' dir='ltr'>" + htmlCode + "</div><br/>"; editor.restoreSelection(); editor.insertHTML(codeBlock); editor.saveUndoStep(); codeModal.remove(); }); } } }
Linus Torvalds talks AI, Rust adoption, and why the Linux kernel is 'the only thing that matters'
Switching to a more modern topic, the introduction of the Rust language into Linux, Torvalds is disappointed that its adoption isn't going faster. "I was expecting updates to be faster, but part of the problem is that old-time kernel developers are used to C and don't know Rust. They're not exactly excited about having to learn a new language that is, in some respects, very different. So there's been some pushback on Rust."