FileTable is a great new feature in SQL Server 2012 which facilitates storing and working with unstructured blob data in SQL Server. Unfortunately is not yet supported in Entity Framework, so you cannot simply use FileTable in your entity model. But there is a workaround for this inconvenience, which I am going to show you in this post.
منابعی برای مطالعهی بیشتر
- Conditional INSERT/UPDATE Race Condition
- “UPSERT” Race Condition With MERGE
- آسیبپذیری Race Condition در آکادمی لیان
- Race Condition in Web Application
- Processing Data Queues in SQL Server with READPAST and UPDLOCK
- PostgreSQL anti-patterns: read-modify-write cycles
- PHP Race Condition Vulnerability Example
- Application Locks (or Mutexes) in SQL Server 2005
- Handle Race Conditions / Concurrency in Code First Entity Framework Applications
چند نکتهی تکمیلی
- در این لحظه فقط پروایدر SQLite مایکروسافت از نوعهای DateOnly و TimeOnly توسط EF-Core پشتیبانی میکند.
- هنوز پشتیبانی از این نوعهای جدید به زیرساخت Microsoft.Data.SqlClient اضافه نشده. به همین جهت EF-Core هم تا نگارش 6 آن چنین پشتیبانی را از این نوعها برای SQL Server ارائه نمیدهد و حتی Migration آن هم از این نوعها برای SQL Server پشتیبانی نمیکند.
- البته سایر پروایدرهای ثالث EF-Core مانند MySQL و PostgreSQL این پشتیبانی را اضافه کردهاند.
رشتهی اتصالی پیشفرض این برنامه LocalDB است که نیازی به تعیین نام کاربری و غیره ندارد. مطلب «LocalDB FAQ» را در مورد نصب و به روز رسانی آن پیگیری کنید.
اگر این رشته را تغییر دادید و قصد استفادهی از SQL Server کامل را دارید، احتمالا رشتهی اتصالی شما از نوع windows authentication است (Integrated Security=true) که نام کاربری یوزر فعلی را که ویژوال استودیوی شما تحت آن اجرا میشود، عنوان کردهاست. این کاربر باید در قسمت accounts/login مربوط به SQL Server دسترسی لازم را به بانک اطلاعاتی که مشخص کردهاید، پیدا کند یا ویژوال استودیو را با دسترسی ادمین اجرا کنید.
نظرات مطالب
EF Code First #1
من هم با مشکل شما مواجه شدم و پس از بررسیهای زیاد مشکل رو در کانکشن پیدا کردم. کد زیر کانکشنی هست که من بصورت لوکال استفاده میکنم (حالت SQL Server Authentication). البته به یک Instance از SQL Server بر روی کامپیوتر خودم متصل میشم.
X نامی هست که از طریق سازنده کلاس Context در لایه DataAccess مشخص کردم.
Y هم نام Instance ای هست که بصورت لوکال وصل میشوم .
<connectionStrings> <add name="X" connectionString="Data Source=Y;Initial Catalog=DataBaseName;User ID=sa; Password=1234;" providerName="System.Data.SqlClient" /> </connectionStrings>
public Context():base("X") { }
نظرات مطالب
EF Code First #2
- در SQL Server اگر تنها یک کانکشن باز به دیتابیس مفروضی وجود داشته باشد، امکان drop آنرا نمیدهد. برای مثال اگر همزمان management studio هم باز است، این مورد یعنی یک کانکشن باز. آنرا ببندید تا SQL Server به این نتیجه برسد که کسی از بانک اطلاعاتی درخواستی در حال استفاده نیست.
- در کل رویه ذخیره شدهی سیستمی به نام SP_WHO وجود دارد که مصرف کنندگان را لیست میکند. شماره آنها را یافته و سپس توسط رویه ذخیره شده دیگری به نام Kill، حذفشان کنید.
- روش دیگر drop آنی یک بانک اطلاعاتی، تک کاربره کردن و سپس حذف آن است:
- در کل رویه ذخیره شدهی سیستمی به نام SP_WHO وجود دارد که مصرف کنندگان را لیست میکند. شماره آنها را یافته و سپس توسط رویه ذخیره شده دیگری به نام Kill، حذفشان کنید.
- روش دیگر drop آنی یک بانک اطلاعاتی، تک کاربره کردن و سپس حذف آن است:
alter database [MyDatbase] set single_user with rollback immediate drop database [MyDatabase]
نظرات مطالب
EF Code First #5
نه. این اصطلاحا instance نام داره. در sql server شما چندین instance میتونید تعریف کنید. اگر نام سرور به تنهایی ذکر شود یعنی وهله پیش فرض. در غیر اینصورت به این معنا است که یک سری تنظیمات امنیتی خاص بر روی وهلهای خاص اعمال شده و شما باید از آن استفاده کنید. (البته میتونه در خطای ذکر شده نام یوزر هم باشه .... باید رشته اتصالی رو ببینم که از چه حالت اعتبار سنجی استفاده میکنه)
در کل این بحث در اینجا ادامه پیدا نکند بهتر است. چون نه مشخص است تنظیمات سرور شما چی هست. نه رشته اتصالی شما رو من دیدم. نه تنظیمات برنامه و Context شما مشخص است و نه تعداد وهلههای سرور. نه سطح دسترسی یوزر اتصالی شما و نه نوع اعتبار سنجی لاگین یوزر متصل به سرور (ویندوزی است یا مخصوص sql server است).
در کل این بحث در اینجا ادامه پیدا نکند بهتر است. چون نه مشخص است تنظیمات سرور شما چی هست. نه رشته اتصالی شما رو من دیدم. نه تنظیمات برنامه و Context شما مشخص است و نه تعداد وهلههای سرور. نه سطح دسترسی یوزر اتصالی شما و نه نوع اعتبار سنجی لاگین یوزر متصل به سرور (ویندوزی است یا مخصوص sql server است).
نظرات مطالب
EF Code First #1
- این ویژگیها رو میتونید فراموش کنید. چون مثلا SP در SQL Server CE وجود خارجی ندارد. اما برنامهی نوشته شده با EF به راحتی میتونه با انواع و اقسام بانکهای اطلاعاتی که پروایدر EF برای آنها مهیا باشد، کار کند. برنامه شما به دیتابیس خاصی گره نمیخوره. اگر لازم بود راحت میتونید با تغییر پروایدر و تغییر کانکشن استرینگ، بدون نیازی به تغییر در کدهای خود، از یک بانک اطلاعاتی دیگر استفاده کنید.
- در EF Code first امکان استفاده از SP و امثال آن هم وجود دارد (در جای خودش توضیح خواهم داده به چه نحوی). البته در این حالت برنامه فقط مختص به SQL Server خواهد شد.
- در EF Code first امکان استفاده از SP و امثال آن هم وجود دارد (در جای خودش توضیح خواهم داده به چه نحوی). البته در این حالت برنامه فقط مختص به SQL Server خواهد شد.
- Power Shell Command Builder | pspcommunity.org
- فایرفاکس 8 فردا معرفی می شود، امکان دانلود از امروز « WinBeta.Net | Where Tech Becomes Life | www.winbeta.net
- وبینار و پادکست آزاد و رایگان Agile | دنیای چابک | blog.irscrum.com
- New SQL Server 2012 Labs and Presentations | blogs.msdn.com
- اضافه کردن Watermark به PDF تولیدی توسط iTextSharp | footheory.com
- دریافت کتاب رایگان Windows Phone Blue Book | www.robmiles.com
- لیست موارد منسوخ شده در SQL Server | technet.microsoft.com
در Entity framework به کمک امکانات LINQ، نمیتوان چندین رکورد را با هم (یکجا) حذف کرد یا به روز رسانی نمود. برای مثال دستوراتی مانند Delete from tbl1 where id>3 و یا update tbl1 set f1=2 where id>3 معادلی در LINQ to EF ندارند. برای انجام اینگونه امور یا باید رویه ذخیره شده نوشت و سپس آنرا در EF فراخوانی کرد؛ یا دستورات SQL خام را مستقیما بر روی بانک اطلاعاتی اجرا کرد و یا باید حلقهای را تشکیل داد و موارد موجود را یک به یک ویرایش یا حذف نمود. مورد آخر خصوصا از لحاظ کارآیی به هیچ عنوان پذیرفتنی نیست.
البته اکثر ORMهای موجود از Bulk operations پشتیبانی نمیکنند و این مورد منحصر به EF نیست. علت آن هم به مشکل بودن هماهنگ سازی Context و بانک اطلاعاتی، پس از Bulk operations بر میگردد. برای مثال در یک کوئری حذف پیچیده، هماهنگ سازی سطح اول کش یا Tracking API با رکوردهای باقی مانده در بانک اطلاعاتی کار سادهای نیست و اگر اینکار به نحو صحیحی صورت نگیرد، کاربران در حین ذخیره سازی اطلاعات ممکن است با خطاهای همزمانی متوقف شوند (چون هنوز رکوردهای حذف شده در سطح اول کش یا Context وجود دارند، ORM تصور میکند کاربر دیگری اطلاعات را حذف کرده است و یک استثنای همزمانی را صادر خواهد کرد).
معرفی Entity Framework Extended Library
کتابخانه «Entity Framework Extended Library» تعدادی متد الحاقی را به EF جهت اعمال Bulk delete و Bulk update سازگار با کوئریهای تهیه شده به وسیله امکانات LINQ to EF، اضافه میکند. البته این کتابخانه امکانات دیگری مانند Future Queries (یکی کردن چند کوئری متفاوت LINQ جهت اجرا در یک رفت و برگشت به بانک اطلاعاتی)، Query Result Cache (سطح دوم کش) را نیز به همراه دارد.
البته اکثر ORMهای موجود از Bulk operations پشتیبانی نمیکنند و این مورد منحصر به EF نیست. علت آن هم به مشکل بودن هماهنگ سازی Context و بانک اطلاعاتی، پس از Bulk operations بر میگردد. برای مثال در یک کوئری حذف پیچیده، هماهنگ سازی سطح اول کش یا Tracking API با رکوردهای باقی مانده در بانک اطلاعاتی کار سادهای نیست و اگر اینکار به نحو صحیحی صورت نگیرد، کاربران در حین ذخیره سازی اطلاعات ممکن است با خطاهای همزمانی متوقف شوند (چون هنوز رکوردهای حذف شده در سطح اول کش یا Context وجود دارند، ORM تصور میکند کاربر دیگری اطلاعات را حذف کرده است و یک استثنای همزمانی را صادر خواهد کرد).
معرفی Entity Framework Extended Library
کتابخانه «Entity Framework Extended Library» تعدادی متد الحاقی را به EF جهت اعمال Bulk delete و Bulk update سازگار با کوئریهای تهیه شده به وسیله امکانات LINQ to EF، اضافه میکند. البته این کتابخانه امکانات دیگری مانند Future Queries (یکی کردن چند کوئری متفاوت LINQ جهت اجرا در یک رفت و برگشت به بانک اطلاعاتی)، Query Result Cache (سطح دوم کش) را نیز به همراه دارد.