استفاده از چندین Context در EF 6 Code first
- استفاده از چند Context برای اینکه هر کدام قرار است در یک دیتابیس جدا ذخیره شوند؟ نمیشود FK بین اینها (جداول دو دیتابیس مختلف) تعریف کرد (SQL Server چنین کاری را پشتیبانی نمیکند).
- اگر برنامه ماژولار است، در EF میتوان به صورت خودکار تمام ماژولها را در طی یک Context یکپارچه بارگذاری کرد (^ و ^).
- هدف از ایجاد Schema در SQL Server، ایجاد ظروفی برای گروه بندی منطقی اشیاء است. مثلا عدهای به سه SP خاص دسترسی داشته باشند. عدهای فقط بتوانند با Viewها کار کنند. یا حتی عدهای به تمام موارد دسترسی داشته باشند. بنابراین یک نوع ایزوله سازی قسمتهای مختلف بانک اطلاعاتی مدنظر هست، در اصل. حالا اگر عدهای فقط به سه جدول خاص دسترسی دارند، آیا میتوانند ارجاعی را به جدول چهارمی که در یک schema دیگر تعریف شده داشته باشند؟ بله. البته فقط به این شرط که کاربران schema سه جدول فعلی به schema جدول چهارم، دسترسی و مجوز لازم را داشته باشد و برای این دسترسی دادنها هم باید مستقلا T-SQL بنویسید.
و ... ضمنا گاهی از اوقات از Schema برای مدیریت نامهای هم نام استفاده میشود. چیزی شبیه به namespace در سیشارپ مثلا. نمونهاش طراحی چند مستاجری است.
نتیجه گیری؟ برای سرگرمی Schema ایجاد نکنید؛ مگر اینکه واقعا قصد ایزوله سازی قسمتهای مختلف یک بانک اطلاعاتی را از کاربرانی خاص داشته باشید. به Schema به شکل یک Sandbox امنیتی (یک قرنطینه) نگاه کنید.
برای مطالعه بیشتر
Understanding the Difference between Owners and Schemas in SQL Server
Implementation of Database Object Schemas
این زیرنویسها فرمت ویژهای دارند:
<li class="transcript-module"> Introduction to ASP.NET MVC 4 <ul> <li class="transcript-clip" data-p="author=scott-allen&name=mvc4-building-m1-intro&mode=live&clip=0&course=mvc4-building"><a href="javascript:void(0)" onclick="LaunchPlayerWindow('http://pluralsight.com/training', 'author=scott-allen&name=mvc4-building-m1-intro&mode=live&clip=0&course=mvc4-building');">Introduction</a><br /> <div> <a href="javascript:void(0)" onclick="p(this);" data-s="1.636">Hi, this is Scott Allen and this is the first module in the course design</a> </div> </li> <li class="transcript-clip" data-p="author=scott-allen&name=mvc4-building-m1-intro&mode=live&clip=1&course=mvc4-building"><a href="javascript:void(0)" onclick="LaunchPlayerWindow('http://pluralsight.com/training', 'author=scott-allen&name=mvc4-building-m1-intro&mode=live&clip=1&course=mvc4-building');">Web Platform Installer</a><br /> <div> ...
public class TranscriptClip { public string Title { set; get; } public IList<TranscriptItem> TranscriptItems { set; get; } } public class TranscriptItem { public double StartTime { set; get; } public string Text { set; get; } }
برای استخراج این اطلاعات، یکی از بهترین ابزارها، کتابخانه HTML Agility pack است که توسط آن میتوان به liهای یاد شده دسترسی یافت:
var nodes = doc.DocumentNode.SelectNodes("//li[@class='transcript-clip']/div");
using System; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Web; using HtmlAgilityPack; namespace PluralsightTranscripts { public class TranscriptClip { public string Title { set; get; } public IList<TranscriptItem> TranscriptItems { set; get; } } public class TranscriptItem { public double StartTime { set; get; } public string Text { set; get; } } public class ExtractSubtitle { public static void ConvertToSrt(string fileName) { var transcriptClips = extractItems(fileName); var itemNumber = 1; foreach (var item in transcriptClips) { transcriptClipToSrt(item, itemNumber); itemNumber++; } } private static void transcriptClipToSrt(TranscriptClip item, int itemNumber) { var count = item.TranscriptItems.Count; var srtFileContent = transcriptItemsToSrt(item.TranscriptItems, count); var fileName = removeIllegalCharacters(string.Format("{0}-{1}.srt", itemNumber.ToString("00"), item.Title)); File.WriteAllText(fileName, srtFileContent); } private static string transcriptItemsToSrt(IList<TranscriptItem> items, int count) { var lineNumber = 1; var sb = new StringBuilder(); for (int row = 0; row < count; row++) { sb.AppendLine(lineNumber.ToString(CultureInfo.InvariantCulture)); sb.AppendLine(getTimeLine(items, count, row)); sb.AppendLine(items[row].Text); sb.AppendLine(string.Empty); lineNumber++; } return sb.ToString(); } private static string getTimeLine(IList<TranscriptItem> items, int count, int row) { var startTs = TimeSpan.FromSeconds(items[row].StartTime); var endTs = row + 1 < count ? TimeSpan.FromSeconds(items[row + 1].StartTime) : TimeSpan.FromSeconds(items[row].StartTime + 5); return string.Format("{0} --> {1}", timeSpanToString(startTs), timeSpanToString(endTs)); } private static string timeSpanToString(TimeSpan lineTs) { return string.Format("{0}:{1}:{2},{3}", lineTs.Hours.ToString("D2"), lineTs.Minutes.ToString("D2"), lineTs.Seconds.ToString("D2"), lineTs.Milliseconds.ToString("D3")); } private static string removeIllegalCharacters(string fileName) { string regexSearch = string.Format("{0}{1}", new string(Path.GetInvalidFileNameChars()), new string(Path.GetInvalidPathChars())); var r = new Regex(string.Format("[{0}]", Regex.Escape(regexSearch))); return r.Replace(fileName, "."); } private static IList<TranscriptClip> extractItems(string fileName) { var htmlContent = File.ReadAllText(fileName); var results = new List<TranscriptClip>(); var doc = new HtmlDocument { OptionCheckSyntax = true, OptionFixNestedTags = true, OptionAutoCloseOnEnd = true, OptionDefaultStreamEncoding = Encoding.UTF8 }; doc.LoadHtml(htmlContent); var nodes = doc.DocumentNode.SelectNodes("//li[@class='transcript-clip']/div"); foreach (var node in nodes) { var itemsList = new List<TranscriptItem>(); var title = node.ParentNode.ChildNodes.First(x => x.Name == "a").InnerText; foreach (var childNode in node.ChildNodes) { if (childNode.Name != "a") continue; var dataS = childNode.Attributes.First(x => x.Name == "data-s"); itemsList.Add(new TranscriptItem { StartTime = double.Parse(dataS.Value), Text = HttpUtility.HtmlDecode(childNode.InnerText.Trim()) }); } results.Add(new TranscriptClip { TranscriptItems = itemsList, Title = title }); } return results; } } }
فرمت SRT ساختار سادهای دارد. هر گفتگوی آن حداقل از سه سطر تشکیل میشود. سطر اول یک شماره خود افزاینده است. سطر دوم زمان شروع و پایان گفتگو را مشخص میکند و سطر سوم بیانگر متن گفتگو است. برای مثال:
1 00:00:01,636 --> 00:00:05,616 Hi, this is Scott Allen and this is the first module in the course design
دریافت پروژه کامل این مطلب
PluralsightTranscripts.zip
<?xml version="1.0" encoding="utf-8"?> <configuration> <system.webServer> ... <aspNetCore processPath="bin\IISSupport\VSIISExeLauncher.exe" arguments="-argFile IISExeLauncherArgs.txt" forwardWindowsAuthToken="false" startupTimeLimit="3600" requestTimeout="23:00:00" stdoutLogEnabled="false" /> ... </system.webServer> </configuration>
<?xml version="1.0" encoding="utf-8"?> <configuration> <system.webServer> ... <aspNetCore processPath=".\ApplicationName.exe" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" /> ... </system.webServer> </configuration>
RML Utilities X64
RML Utilities X86
که نهایتا در این مسیر C:\Program Files\Microsoft Corporation\RMLUtils نصب خواهد شد.
سپس در خط فرمان این سه دستور را امتحان کنید:
-- Insert 10000 records using 20 threads, Repeat Execution 3 times -- disk-based "C:\Program Files\Microsoft Corporation\RMLUtils\ostress.exe" –n20 –r3 -S. -E -dTestdb2 -q -Q"set statistics time off; SET STATISTICS IO Off; set nocount on; DECLARE @start datetime = getdate(); declare @insertCount int = 10000; declare @startId int = 1; while @startId < @insertCount begin insert into tblNormal values ('Test', '2013-01-01T00:00:00') set @startId +=1 end; Print DATEDIFF(ms,@start,getdate());" –oc:\temp\output -- memory-optimized, tblMemoryOptimized_Schema_And_Data "C:\Program Files\Microsoft Corporation\RMLUtils\ostress.exe" –n20 –r3 -S. -E -dTestdb2 -q -Q"set statistics time off; SET STATISTICS IO Off; set nocount on; DECLARE @start datetime = getdate(); declare @insertCount int = 10000; declare @startId int = 1; while @startId < @insertCount begin insert into tblMemoryOptimized_Schema_And_Data values ('Test', '2013-01-01T00:00:00') set @startId +=1 end; Print DATEDIFF(ms,@start,getdate());" –oc:\temp\output -- memory-optimized, tblMemoryOptimized_Schema_Only "C:\Program Files\Microsoft Corporation\RMLUtils\ostress.exe" –n20 –r3 -S. -E -dTestdb2 -q -Q"set statistics time off; SET STATISTICS IO Off; set nocount on; DECLARE @start datetime = getdate(); declare @insertCount int = 10000; declare @startId int = 1; while @startId < @insertCount begin insert into tblMemoryOptimized_Schema_Only values ('Test', '2013-01-01T00:00:00') set @startId +=1 end; Print DATEDIFF(ms,@start,getdate());" –oc:\temp\output
البته برای اجرای این دستورات نیاز است فیلد CustomerID را identity تعریف کنید (در هر سه جدول مطلب جاری).
-- It is not Memory Optimized CREATE TABLE tblNormal ( [CustomerID] int identity NOT NULL PRIMARY KEY NONCLUSTERED, [Name] nvarchar(250) NOT NULL, CustomerSince DATETIME not NULL INDEX [ICustomerSince] NONCLUSTERED ) -- DURABILITY = SCHEMA_AND_DATA CREATE TABLE tblMemoryOptimized_Schema_And_Data ( [CustomerID] INT identity NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 131072), [Name] NVARCHAR(250) NOT NULL, [CustomerSince] DATETIME NOT NULL INDEX [ICustomerSince] NONCLUSTERED ) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA) -- DURABILITY = SCHEMA_ONLY CREATE TABLE tblMemoryOptimized_Schema_Only ( [CustomerID] INT identity NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 131072), [Name] NVARCHAR(250) NOT NULL, [CustomerSince] DATETIME NOT NULL INDEX [ICustomerSince] NONCLUSTERED ) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_ONLY)
بررسی تغییرات Blazor در دات نت 8
What's New in Blazor for .NET 8
Come find out about the future of Blazor in .NET 8! We'll explore all the upcoming features and improvements, including our effort to create a unified full stack web UI programming model that combines the strengths of client and server. We hope to see you there!
You will learn:
How Blazor is becoming the best option for full stack web development
How Blazor in .NET 8 will provide full flexibility to build web apps however works best for you
How to try out the latest Blazor features in .NET 8
.NET Data Community Standup - Azure SQL Database and SQL Server 2022: what’s new for developers
During this show we will discuss some of the new capabilities introduced on both SQL Server and our Azure services that have an impact on app development like:
T-SQL and IQP enhancements
Local Development Experience
JSON enhancements
DataAPI Builder
And more…