با تشکر؛ یک دست سازی ی و ک در EF Core به چه صورت هست؟
چندین روش برای تعریف رشته اتصالی در EF وجود دارد. بیشتر در اینجا
کتابخانه extended ef هم به نظر در این مورد جالب است.
نظرات مطالب
EF Code First #12
من از EF 4.3.1 استفاده میکنم ولی متد AddOrUpdate ندارد
همچین چیزی واسه EF سراغ دارین؟
مطالب
دریافت خروجی سایت
یکی از مشکلاتی که من هر روز در لاگهای سایت مشاهده میکنم، علاقه وافر بسیاری برای دریافت محتوای کل سایت با استفاده از برنامههای مخصوص آن است. البته این افراد هیچ وقت به طور کامل موفق نخواهند شد چون سایت پس از مدتی IP آنها را خواهد بست. اما ... این بازی از روز اول تمامی نداشته ....
بنابراین ضمن اعلام آتش بس (!) اعلام میدارد کل محتوای سایت به صورت یک فایل PDF در قسمت ویژه کاربران سایت، قابل دریافت است و یا «دریافت خروجی کامل NET Tips. با فرمت EPub»
این محتوا به صورت خودکار هر روز صبح ساعت 5، بر اساس آخرین تغییرات سایت، به روز خواهد شد.
بنابراین ضمن اعلام آتش بس (!) اعلام میدارد کل محتوای سایت به صورت یک فایل PDF در قسمت ویژه کاربران سایت، قابل دریافت است و یا «دریافت خروجی کامل NET Tips. با فرمت EPub»
این محتوا به صورت خودکار هر روز صبح ساعت 5، بر اساس آخرین تغییرات سایت، به روز خواهد شد.
یک نکته: فایلهای CHM دریافتی از طریق مرورگرها، به صورت پیشفرض قابل نمایش نیستند. باید بر روی آنها کلیک راست کنید و سپس در برگهی خواص فایل، بر روی دکمهی unblock آن فایل کلیک کنید تا قابل استفاده شود.
در پاسخ به سوال شما باید عرض کنم که حرف شما کاملا درست است. به این دلیل که با هر فراخوانی از سمت کلاینت لیست permissionهای کاربر واکشی میشود. برای کم کردن این فراخوانیها و واکشیها ما چند راه در پیش رو خواهیم داشت.
1. استفاده از caching اولین راه حل و سادهترین راه حل هست. به این صورت که در هنگامی که کاربر وارد برنامه میشود تمامی دسترسیهای او در cache ذخیره شود. برای این کار نیاز به نوشتن سرویسی برای مدیریت این حافظه است. فرض کنید در این حین دسترسی نقشی که کاربر در آن نقش است تغییر کند. بنابراین باید تمامی cache از نو ایجاد شود. توجه کنید که ما نمیتوانیم در معماری REST و Web API از Session استفاده کنیم. به این دلیل که فرایندها در این معماری Stateless هستند، به این معنی که چیزی را در خود نگه نمیدارند.
2. روش دیگر استفاده از Claim در Asp.Net Identity 2 است. در سیستم Identity جدید Asp شما قادر هستید چندین Claim برای کاربر تنظیم (set) کنید. برای این کار میتوانید مقاله ای در این زمینه را از سایت bitOfTech مطالعه کنید. در این مجموعه مقالات تشریح شده است که چگونه میتوان Claimهای شخصی سازی شده در سیستم تعریف کرد. در نهایت این Claimها hash شده و در Token کاربر ذخیره میشوند. توصیه میکنم اگر تعداد دسترسیهای شما در هر نقش زیاد نیست میتوانید از این روش استفاده کنید. البته این را مد نظر داشته باشید در این مقالات نحوه Authorize کردن کاربر با آنچه ما در این مجموعه مقالات تشریح کردیم کمی متفاوت است.
مسیرراهها
SQL Server
آخرین تاریخ بروزرسانی 93/10/21
SQL Server 2005
SQL Server 2008
SQL Server 2012
SQL Serve 2014
SQL Server 2005
SQL Server 2008
- SQL Server 2008: Script Data
- سرویس پک یک SQL Server 2008
- اس کیوال سرور 2008 و عملگرهای C مانند
- انتقال فایلهای دیتابیس اس کیوال سرور 2008
- فشرده سازی اطلاعات در SQL server 2008
- مقایسه امنیت Oracle11g و SQL server 2008 از دید آمار در سال 2009
- آشنایی با قابلیت FileStream اس کیوال سرور 2008 - قسمت اول
- آشنایی با قابلیت FileStream اس کیوال سرور 2008 - قسمت دوم
- آشنایی با قابلیت FileStream اس کیوال سرور 2008 - قسمت سوم
- تهیه گزارش از منسوخ شدههای مورد استفاده در SQL Server 2008
- استفاده از قابلیت Script Data اس کیوال سرور 2008 از طریق برنامه نویسی
- Resource Governor در 2008 SQL Server
- Embed کردن SQL Server Express 2008 در یک برنامه
SQL Server 2012
- Microsoft® SQL Server® 2012
- نحوه تبدیل نگارش SQL Server 2012 RTM مدت دار، به نگارش کامل
- نحوه ایجاد Sequence و استفاده آن در Sql Server 2012
- بررسی الگوهای ایندکسهای Non-Clustered در SQL Server
- آشنایی با Column Store Index در SQL Server 2012
- آشنایی با Contained Databases در SQL Server 2012
- استفاده از Sparse Columns در SQL Server 2012
- تغییر نام پایگاه داده و فایل هایش در SQL Server 2012
- گرفتن خروجی XML از جداول در SQL Server 2012
- گرفتن خروجی JSON از جداول در SQL Server 2012
- آشنایی با FileTable در SQL Server 2012 بخش 1
- آشنایی با FileTable در SQL Server 2012 بخش 2
SQL Serve 2014
- معرفی OLTP درون حافظهای در SQL Server 2014
- ایجاد جداول بهینه سازی شده برای حافظه در SQL Server 2014
- ابزارهای مهاجرت به OLTP درون حافظهای در SQL Server 2014
- ماندگاری با تاخیر در SQL Server 2014
- امکان استفاده از یک هارد SSD بجای RAM در SQL Server 2014
- کاهش حجم لاگ فایلهای اسکیوال سرور 2005 و 2008
- گزارشگیری از تاریخچهی پشتیبانگیریها در اس کیوال سرور
- گزارشگیری از تاریخچهی اجرای کوئریها در SQL Server
- تشخیص کمبود ایندکسها در SQL server
- پیدا کردن لیست SQL serverهای نصب شده در یک شبکه
- چرا نباید از کوئریهای select * استفاده کرد؟
- منسوخ شدهها در نگارشهای جدید SQL server
- پیدا کردن وابستگیهای اشیاء در SQL Server
- به روز رسانی Viewها و رویههای ذخیره شده در SQL server
- نحوه راه اندازی مجدد یک دیتابیس اس کیوال سرور پس از پر شدن هارد دیسک
- مشکل اتصال به اس کیوال سرور 2000 از طریق management studio 2008
- مشکل ی و ک فارسی و عربی در یک دیتابیس اس کیوال سرور
- مونیتور کردن میزان مصرف CPU در اس کیوال سرور
- تنظیمات پیشنهادی حداکثر حافظهی مصرفی اس کیوال سرور
- Microsoft SQL Server 2008 Management Objects
- مونیتور کردن میزان فضای خالی باقیمانده در سرور توسط اس کیوال سرور
- آیا از وضعیت رویههای ذخیره شدهی دیتابیسهای اس کیوال سرور خود خبر دارید؟
- تعیین اعتبار کردن یک عبارت SQL
- تعیین اعتبار کردن یک عبارت SQL - قسمت دوم
- نگهداری ایندکسها در اسکیوال سرور
- حذف سریع تمام رکوردها در SQL server
- بررسی صحت پشتیبانهای تهیه شده در SQL Server
- یافتن لیست اسمبلیهای ارجاعی
- مقایسه ساختاری دو دیتابیس SQL Server
- sp_send_dbmail و ارسال ایمیل فارسی
- محدود کردن دسترسی به اس کیوال سرور بر اساس IP
- مقایسه نتایج الگوریتمهای هش کردن اطلاعات در اس کیوال سرور و دات نت
- تنظیم درجه سازگاری یک دیتابیس اس کیوال سرور
- مقایسه رکوردهای دو جدول
- تهیه بک آپهای خودکار از SQL Server Express
- بازسازی msdb تخریب شده
- مقایسه حساس به حروف کوچک و بزرگ در SQL Server
- مزیتهای استفاده از رویههای ذخیره شده؛ واقعیت یا توهم؟!
- روشهایی برای حذف رکوردهای تکراری
- ذخیره سازی فایلها در دیتابیس یا استفاده از فایل سیستم متداول؟
- به روز رسانی فیلدهای XML در SQL Server
- Optimize for unknown
- FxCop برای SQL Server
- با رویههای ذخیره شده خود، وب سرویس ایجاد کنید
- به روز رسانی فیلدهای XML در SQL Server - قسمت دوم
- مرجعی در مورد نگارشهای مختلف SQL Server
- یافتن تداخلات Collations در SQL Server
- عدم کاهش حجم لاگ فایل SQL Server
- دریافت خطای database is not accessible و نحوهی رفع مشکل
- سرورهای متصل شدهی SQL Server و مبحث تراکنشها
- چک لیست نصب SQL Server
- درک نمودار
- بررسی مقدار دهی اولیه متغیرها در T-SQL
- اگر نصب سرویس پک اس کیوال سرور Fail شد ...
- ایجاد بک آپ برای دیتابیس با استفاده از CMD
- انتخاب Sub Query درون پرانتزها به کمک [+Ctrl+Shift
- روشی جهت یافتن فیلدهای استفاده شده درون Stored Procedure ، Function و View
- آشنایی با Row_Number،Rank،Dense_Rank،NTILE
- بازگردانی پایگاه داده بدون فایل لاگ
- LocalDB چیست؟
- آشنایی با تابع PATINDEX در SQL Server
- اجرای Stored Procedure با چند نوع مقدار برگشتی توسط EF CodeFirst
- آشنایی با SQL Server Data Tools
- مشکل ارتباط با SQL Server در لوکال
- آشنایی با Window Functionها در SQL Server بخش اول
- آشنایی با Window Functionها در SQL Server بخش دوم
- آشنایی با Window Functionها در SQL Server بخش سوم
- آشنایی با Window Functionها در SQL Server بخش چهارم
- استفاده از SQLDom برای آنالیز عبارات T-SQL
- دسته بندی سطرهای جدول
- حذف نمودن کاراکترهای ناخواسته توسط Recursive CTE قسمت اول
- جستجوی کاراکترهای wildcards توسط ماده اختیاری ESCAPE
- ستون محاسباتی (computed column)
- گذری بر مفاهیم relationship
- حذف کاراکترهای ناخواسته توسط Recursive CTE قسمت دوم
- از کار افتادن SQL Server Agent
- بدست آوردن برگهای یک درخت توسط Recursive CTE
- بررسی مساله متداول Top N در نسخههای مختلف SQL Server
- فعال و غیر فعال کردن قیود
- مروری بر طراحی Schema less بانک اطلاعاتی SisoDb
- اجرای یک Script حاوی دستورات Go در سی شارپ
- آشنایی با Window Functionها در SQL Server بخش پنجم
- افزودن یک DataType جدید برای نگهداری تاریخ خورشیدی - 1
- افزودن یک DataType جدید برای نگهداری تاریخ خورشیدی - 2
- افزودن یک DataType جدید برای نگهداری تاریخ خورشیدی - 3
- نحوه انتقال اطلاعات استخراج شده از وب سرویس به SQL Server به کمک SSIS
- Full Text Search و Rank فیلدهای بازیابی شده
- بررسی دستور Truncate Table و Delete
- Identity و مباحث مربوط به آن (قسمت اول) - آشنایی با Identity
- Identity و مباحث مربوطه (قسمت دوم) نحوه بدست آوردن مقادیر Identity
- ویدئوی آموزش مقدمات CodeFirst در قالب یک کلاس آموزشی به همراه مثال
- مفهوم READ_COMMITTED_SNAPSHOT در EF 6
- آشنایی با SQL Server Common Table Expressions - CTE
- NoSQL و مایکروسافت
- نحوه تهیه گزارش در SSRS و انتشار آن روی وب سرور
- مدیریت اطلاعات وابسته به زمان در بانکهای اطلاعاتی رابطهای
- تبدیل اعداد صحیح و اعشاری به حروف در T-SQL با استفاده از Join
- SQL Instance
- خواندن سریع اطلاعات فایل اکسل و ذخیره در بانک SQL
- افزودن اکانت مدیریتی فراموش شده به SQL Server
- اندازه گیری کارآیی پرس و جوها با استفاده از SET STATISTICS TIME
- ساخت کاربر ویندوز توسط SQL Server
- بررسی Transactions و Locks در SQL Server
- معرفی و استفاده از DDL Triggers در SQL Server
- بررسی دو نکته (ترفند) کاربردی در SQL Server
- بررسی ابزار SQL Server Profiler
- اجرای SSIS Package از طریق برنامه کاربردی
- پردازش دادههای جغرافیایی به کمک SQL Server و Entity framework
- استفاده از قابلیت پارتیشن بندی در آرشیو جداول بانکهای اطلاعاتی SQL Server
- بررسی بارگذاری دادهها در انبارهای داده و معرفی الگوهای بکار رفته در آن
- بهبود عملکرد SQL Server Locks در سیستمهای با تعداد تراکنش بالا در Entity Framework
- SQL Antipattern #1
- SQL Antipattern #2
- پیاده سازی عملیات صفحه بندی (paging) در sql server
- فعالسازی Multiple Active Result Sets
- استفاده از SQLDom برای آنالیز عبارات T-SQL، قسمت دوم
- اتصال به SQL از راه دور (Remote) و یا به یک سرور در شبکه
- نحوه تعریف Linked Server و دریافت اطلاعات از سروری دیگر
یک نکتهی تکمیلی: روش ذخیره سازی کلید موقتی تولید شده در بانک اطلاعاتی بجای حافظهی سرور
سیستم data protection به همراه اینترفیسی است به نام IXmlRepository که از آن میتوان برای مشخص سازی محل ذخیره سازی XML ایی اطلاعات کلید تولید شده استفاده کرد. این امکان هم وجود دارد که این اینترفیس را طوری پیاده سازی کرد تا اطلاعات را درون بانک اطلاعاتی ذخیره کند. به صورت ذیل:
ابتدا کلاس AppDataProtectionKey را به عنوان یک موجودیت جدید به سیستم EF معرفی میکنیم:
کار این جدول، ذخیره سازی اطلاعات کلید موقتی است تا پس از ری استارت سرور، این اطلاعات از دست نروند و قابلیت بازیابی خودکار را داشته باشند.
سپس آنرا به Context برنامه به صورت ذیل اضافه میکنیم:
با این تنظیمات:
در ادامه پیاده سازی ویژهی ذیل را از IXmlRepository، که از اطلاعات فوق استفاده میکند، تهیه خواهیم کرد:
در این اینترفیس نحوهی دسترسی به یک context جدید، اندکی متفاوت است از حالتهای متداول. در اینجا چون میخواهیم این کلاس تاثیری را بر روی واحد کار درخواست جاری نگذارد، یک context جدید را برای آن وهله سازی میکنیم و از context موجود در طی طول عمر درخواست جاری استفاده نخواهیم کرد.
اطلاعات متدهای سرویس فوق به صورت خودکار توسط سیستم data-protection تامین میشوند. تنها کاری را که در اینجا انجام دادهایم، گوش فرادادن به این تغییرات و ذخیره سازی آنها در بانک اطلاعاتی است.
مرحلهی آخر کار، معرفی این تغییرات به سیستم است که نحوهی انجام آنرا در ذیل مشاهده میکنید:
ابتدا محل تامین سرویس IXmlRepository مشخص شدهاست. سپس روش مقدار دهی XmlRepository را ملاحظه میکنید که باید به این صورت باشد. مقدار آن نیز از سرویس DataProtectionKeyService سفارشی ما تامین میشود. در انتها طول عمر کلید تولید شده، نام برنامه و الگوریتمهای مدنظر تنظیم شدهاند.
همین مقدار تنظیم سبب خواهد شد تا به صورت خودکار اطلاعات موقتی کلیدهای رمزنگاری سیستم data-protection در بانک اطلاعاتی ذخیره شده و یا بازیابی شوند.
این تغییرات به پروژهی DNTIdentity اعمال شدهاند.
سیستم data protection به همراه اینترفیسی است به نام IXmlRepository که از آن میتوان برای مشخص سازی محل ذخیره سازی XML ایی اطلاعات کلید تولید شده استفاده کرد. این امکان هم وجود دارد که این اینترفیس را طوری پیاده سازی کرد تا اطلاعات را درون بانک اطلاعاتی ذخیره کند. به صورت ذیل:
ابتدا کلاس AppDataProtectionKey را به عنوان یک موجودیت جدید به سیستم EF معرفی میکنیم:
public class AppDataProtectionKey { public int Id { get; set; } public string FriendlyName { get; set; } public string XmlData { get; set; } }
سپس آنرا به Context برنامه به صورت ذیل اضافه میکنیم:
public virtual DbSet<AppDataProtectionKey> AppDataProtectionKeys { get; set; }
modelBuilder.Entity<AppDataProtectionKey>(builder => { builder.ToTable("AppDataProtectionKeys"); builder.HasIndex(e => e.FriendlyName).IsUnique(); });
در ادامه پیاده سازی ویژهی ذیل را از IXmlRepository، که از اطلاعات فوق استفاده میکند، تهیه خواهیم کرد:
public class DataProtectionKeyService : IXmlRepository { private readonly IServiceProvider _serviceProvider; public DataProtectionKeyService(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; _serviceProvider.CheckArgumentIsNull(nameof(_serviceProvider)); } public IReadOnlyCollection<XElement> GetAllElements() { return _serviceProvider.RunScopedContext<ReadOnlyCollection<XElement>>(context => { var dataProtectionKeys = context.Set<AppDataProtectionKey>(); return new ReadOnlyCollection<XElement>(dataProtectionKeys.Select(k => XElement.Parse(k.XmlData)).ToList()); }); } public void StoreElement(XElement element, string friendlyName) { // We need a separate context to call its SaveChanges several times, // without using the current request's context and changing its internal state. _serviceProvider.RunScopedContext(context => { var dataProtectionKeys = context.Set<AppDataProtectionKey>(); var entity = dataProtectionKeys.SingleOrDefault(k => k.FriendlyName == friendlyName); if (null != entity) { entity.XmlData = element.ToString(); dataProtectionKeys.Update(entity); } else { dataProtectionKeys.Add(new AppDataProtectionKey { FriendlyName = friendlyName, XmlData = element.ToString() }); } context.SaveChanges(); }); } }
اطلاعات متدهای سرویس فوق به صورت خودکار توسط سیستم data-protection تامین میشوند. تنها کاری را که در اینجا انجام دادهایم، گوش فرادادن به این تغییرات و ذخیره سازی آنها در بانک اطلاعاتی است.
مرحلهی آخر کار، معرفی این تغییرات به سیستم است که نحوهی انجام آنرا در ذیل مشاهده میکنید:
private static void addCustomDataProtection(this IServiceCollection services, SiteSettings siteSettings) { services.AddScoped<IXmlRepository, DataProtectionKeyService>(); services.AddSingleton<IConfigureOptions<KeyManagementOptions>>(serviceProvider => { return new ConfigureOptions<KeyManagementOptions>(options => { var scopeFactory = serviceProvider.GetRequiredService<IServiceScopeFactory>(); using (var scope = scopeFactory.CreateScope()) { options.XmlRepository = scope.ServiceProvider.GetService<IXmlRepository>(); } }); }); services .AddDataProtection() .SetDefaultKeyLifetime(siteSettings.CookieOptions.ExpireTimeSpan) .SetApplicationName(siteSettings.CookieOptions.CookieName) .UseCryptographicAlgorithms(new AuthenticatedEncryptorConfiguration { EncryptionAlgorithm = EncryptionAlgorithm.AES_256_CBC, ValidationAlgorithm = ValidationAlgorithm.HMACSHA256 }); }
همین مقدار تنظیم سبب خواهد شد تا به صورت خودکار اطلاعات موقتی کلیدهای رمزنگاری سیستم data-protection در بانک اطلاعاتی ذخیره شده و یا بازیابی شوند.
این تغییرات به پروژهی DNTIdentity اعمال شدهاند.