با فرض فعال سازی و ثبت PersianDateModelBinder، این خطا زمانی حاصل میشود که یک فیلد datetime مقدار دهی نشده را بخواهید در بانک اطلاعاتی ذخیره کنید. نوع datetime در دات نت value type است و مقدار پیش فرض آن 0001-01-01 است (DateTime.MinValue) که قابل ذخیره سازی در بانک اطلاعاتی نیست. یا فیلد را nullable تعریف کنید (هم در سمت کدها و هم در سمت بانک اطلاعاتی) و یا حتما هنگام ذخیره سازی اطلاعات، آنرا مقدار دهی کنید تا مقدار پیش فرض خود را نداشته باشد.
نظرات مطالب
MVC Scaffolding #2
در بخش EF Code First #11 عنوان کردید که مایکروسافت در تعریف DbContext اعلام میکند که DbSetها همان repository هستند و لایه ای دیگری ایجاد نشود، پس چرا در Scaffolding پارامتری برای آن در نظر گرفته است.
ببخشید من در استفاده از scaffolding در پروژه اصلی زمانی که کلاسها را در پروژه دیگری تعریف میکنم مشکل دارم . خطا میدهد ولی اگر کلاسها در یک پروژه تعریف شوند مشکلی ندارد.
- لوسین مستقل است از بانک اطلاعاتی. همچنین یکبار باید این ایندکس را تهیه کنید. اگر تعداد رکوردهای شما بالا است، فقط همان بار اول است که کار تهیه زمانبر خواهد بود. برای دفعات بعد در حد اضافه کردن چند سند لوسین به آن یا به روز رسانی و حذف است و کار دیگری ندارد.
- پس از تهیه ایندکس، جستجوی لوسین کاری به بانک اطلاعاتی شما ندارد. بر روی ایندکس خودش انجام میشود و نیازی به جستجوی مجدد در بانک اطلاعاتی شما نیست. یک سیستم مستقل است.
این روش متداول کار با لوسین است و حالت دیگری هم ندارد. این مستقل بودن هم یک مزیت است. برای مثال SQL Server CE یا خیلی از بانکهای اطلاعاتی دیگر Full Text Search توکار ندارند. اینجا لوسین خوب جواب میده.
ضمن اینکه من در یک دمو استفاده از لوسین برای ایندکس کردن کل اطلاعات ویکیپدیا رو دیدم. تهیه ایندکس آن یک روز کار برده بوده (با توجه به حجم اطلاعات بالای ویکی پدیا)، اما جستجوی آن فوق العاده سریع و با کیفیت بود. این ویدیو رو در اینجا میتونید مشاهده کنید:
- پس از تهیه ایندکس، جستجوی لوسین کاری به بانک اطلاعاتی شما ندارد. بر روی ایندکس خودش انجام میشود و نیازی به جستجوی مجدد در بانک اطلاعاتی شما نیست. یک سیستم مستقل است.
این روش متداول کار با لوسین است و حالت دیگری هم ندارد. این مستقل بودن هم یک مزیت است. برای مثال SQL Server CE یا خیلی از بانکهای اطلاعاتی دیگر Full Text Search توکار ندارند. اینجا لوسین خوب جواب میده.
ضمن اینکه من در یک دمو استفاده از لوسین برای ایندکس کردن کل اطلاعات ویکیپدیا رو دیدم. تهیه ایندکس آن یک روز کار برده بوده (با توجه به حجم اطلاعات بالای ویکی پدیا)، اما جستجوی آن فوق العاده سریع و با کیفیت بود. این ویدیو رو در اینجا میتونید مشاهده کنید:
- با توجه به مزیتهایی که قبلاً در پیادهسازی سرویس محور برای IUnitOfWork در نظر گرفته میشد و به طور مفصل هم درباره آن بحث شد، در این نوع پیادهسازی آیا باید نگرش جدیدی به استفاده مستقیم از DbContext اصلی برنامه داشت؟
- برای استفاده از مطلب کار با چندین نوع بانک اطلاعاتی متفاوت در Entity Framework Core در حالت فوق و با توجه به حذف IUnitOfWork، آیا پیادهسازی زیر صحیح است:
namespace MinimalBlog.Dal.SqlServer public class SqlServerDbContext : MinimalBlogDbContext { //Sql Server Settings }
namespace MinimalBlog.Dal.Sqlite public class SqliteDbContext : MinimalBlogDbContext { //Sqlite Settings }
var connectionStringKey = Configuration.GetConnectionString("InUseKey"); var connectionString = Configuration.GetConnectionString(connectionStringKey); switch (connectionStringKey) { case "SqlServerConnection": services.AddScoped<MinimalBlogDbContext, SqlServerDbContext>(); services.AddDbContext<SqlServerDbContext>(options => opt.UseSqlServer(connectionString)); break; case "SqliteConnection": services.AddScoped<MinimalBlogDbContext, SqliteDbContext>(); services.AddDbContext<SqliteDbContext>(options => options.UseSqlite(connectionString)); break; default: throw new NotImplementedException($"`{connectionStringKey}` is not defined in `appsettings.json` file."); }
ممنون.
با بیشتر مطالب شما موافقم ولی Repositoryها نیز دلیلی برای وجود دارند.
»الگوی Repository بسیار پروژه را تست پذیر میکند. به راحتی با استفاده از کتابخانههای Mock میتوان بخش دسترسی به داده را تست کرد.
با بیشتر مطالب شما موافقم ولی Repositoryها نیز دلیلی برای وجود دارند.
»الگوی Repository بسیار پروژه را تست پذیر میکند. به راحتی با استفاده از کتابخانههای Mock میتوان بخش دسترسی به داده را تست کرد.
»اگر منظور شما از StoreContext ، کلاسی است که مستقیم از DBContext ارث برده است، در نتیجه امکان استفاده از دستوراتی نظیر Entry of T و Set of T یا مواردی مربوط به Change Tracking نیز به صورت مستقیم حتی در الگوی CQRS نیز وجود دارد. چگونه میتوانید دستوراتی این چنینی را Mock کنید؟ استفاده از کتابخانههای Mock نظیر Moq برای تست دستوراتی نظیر Entry Of T و SetCurrentValues و GetCurrentValues کمکی به شما نمیکند. (برای DbSet کتابخانه ای نظیر FakeDbSet وجود دارد ولی برای سایر دستورات خیر...)
»اگر از روش توصیه شده در این جا استفاده کنید باز برای Mock آبجکت IUnitOfWork به مشکل بر خواهید خورد. در این حالت برای تست لایههای دسترسی بهتر است از کتابخانه هایی نظیر Effort استفاده نمایید.
» در بخش شناسه مشتری جدید را نیاز داشتم یک راه حل را فراموش کردید و آن استفاده از GUID برای تعریف Id هر entity است در نتیجه دیگر نیازی به واکشی مجدد رکورد نخواهید داشت.
»بهتر است متد Save را نیز در Repository قرار ندهید. متد Save باید توسط UnitOfWork به اشتراک گذاشته شده فراخوانی شود.
»اگر از روش توصیه شده در این جا استفاده کنید باز برای Mock آبجکت IUnitOfWork به مشکل بر خواهید خورد. در این حالت برای تست لایههای دسترسی بهتر است از کتابخانه هایی نظیر Effort استفاده نمایید.
» در بخش شناسه مشتری جدید را نیاز داشتم یک راه حل را فراموش کردید و آن استفاده از GUID برای تعریف Id هر entity است در نتیجه دیگر نیازی به واکشی مجدد رکورد نخواهید داشت.
»بهتر است متد Save را نیز در Repository قرار ندهید. متد Save باید توسط UnitOfWork به اشتراک گذاشته شده فراخوانی شود.
نظرات مطالب
مروری بر چند تجربهی کاری با SQLite
سلام،
بله. تا این حد رو خوب جواب میده. البته مکانیزمهای کش کردن اطلاعات رو باید خودتون در نظر داشته باشید و پیاده سازی کنید.
ضمنا استفاده از SQL Server Compact Edition را هم مدنظر داشته باشید (اگر کار شما فقط ویندوزی است)؛ نسخهی جدید آن قرار است از Entity framework پشتیبانی کند و مشکلات استفاده چند کاربری را هم نخواهد داشت و برای ASP.NET بهینه سازی شده؛ هر چند برای SQLite هم اکنون پروایدر EF موجود است.
بله. تا این حد رو خوب جواب میده. البته مکانیزمهای کش کردن اطلاعات رو باید خودتون در نظر داشته باشید و پیاده سازی کنید.
ضمنا استفاده از SQL Server Compact Edition را هم مدنظر داشته باشید (اگر کار شما فقط ویندوزی است)؛ نسخهی جدید آن قرار است از Entity framework پشتیبانی کند و مشکلات استفاده چند کاربری را هم نخواهد داشت و برای ASP.NET بهینه سازی شده؛ هر چند برای SQLite هم اکنون پروایدر EF موجود است.
- Code::Blocks 10.05 – محیط برنامه نویسی – برنامه ها | www.barnameha.com
- GitaCalendar 1.3.0.2 – گدجت تقویم خورشیدی – برنامه ها | www.barnameha.com
- الف - دلایل روی آوردن ایرانی ها به عضویت در فیس بوک | www.alef.ir
- امکان ایجاد Page های تجاری و شخصی در گوگل پلاس فراهم شد | www.persianweblog.com
- پایگاه خبری وبسایتهای ایران | اینترنت جدا اینترانت جدا | www.webna.ir
- خواندن تصاویر از بانک اطلاعاتی | www.yazdinezhad.com
- وبلاگ رادمان » شیاطین دیجیتال | weblog.radmanitd.com
- Netduino Controlled LED Cube | Coding4Fun Articles | Channel 9 | channel9.msdn.com
- آشنایی با Autos window | blogs.msdn.com
- افزونه Web Essentials | www.hanselman.com
- به دست آوردن آخرین رکورد بازبینی شده در دیتابیس توسط Linq | mojtabasahraei.blogfa.com
- تو یک برنامه نویسی، پس چرا برای شخص دیگری کار میکنی؟! | www.intermittentintelligence.com
- چگونه تشخیص دهیم که برنامهی دات نت ما قابل انتقال به لینوکس هست؟ | mono-framework.com
آیا میدانید چند درصد از کدهای یک پروژه شما در قسمتهای مختلف آن تکراری هستند و تا چه حد نیاز به refactoring کدهای موجود جهت مدیریت و نگهداری سادهتر از آن پروژه وجود دارد؟
اخیرا پروژه سورس بازی در سایت CodePlex به نام Clone detective ارائه شده است که این کار را به صورت خودکار با یکپارچه شدن با Visual studio برای شما انجام میدهد. این افزودنی از آدرس زیر قابل دریافت است:
http://www.codeplex.com/CloneDetectiveVS
بهترین آموزش نحوه استفاده از آن هم از طریق ویدیوی زیر در دسترس است:
مشاهده
در نگارش فعلی آن تنها پروژههای سی شارپ پشتیبانی میشوند و در نگارشهای آتی آن قرار است VB.net و CPP نیز افزوده شوند.
به چه دلیلی به این ابزار نیاز داریم؟
فرض کنید کلاسی را جهت انجام مقصودی خاص توسعه دادهاید. در کلاسی دیگر برای اتمام آن، 15 سطر از یکی از توابع کلاس اول را کپی کرده و مورد استفاده قرار دادهاید. در یک پروژه بزرگ از این موارد شاید زیاد رخ دهد (خصوصا در یک کار تیمی که ممکن است قسمتی از کار شما بهعنوان پایه اولیه کاری دیگر مورد استفاده قرار گیرد). پس از مدتی، تغییراتی را در کلاس اول ایجاد کرده و یک سری از عیوب آن 15 سطر را که جزئی از یک تابع است برطرف خواهید کرد. بسیار هم خوب! آیا این پایان کار است؟ خیر!
آیا این مورد به کل پروژه منتقل شده است؟ آیا نگهداری یک پروژه بزرگ که دارای قسمتهای تکراری زیادی است کار سادهای است؟
علاوه بر ابزار فوق، برنامه دیگری نیز جهت تشخیص کدهای تکراری در یک پروژه به نام Simian موجود است. Simian را از آدرس زیر میتوانید دریافت کنید:
http://www.redhillconsulting.com.au/products/simian/overview.html
این ابزار به صورت یک افزودنی VS.net ارائه نشده است اما میتوان از طریق منوی tools آنرا به مجموعه ابزارهای مورد استفاده اضافه کرد. نحوه انجام اینکار به صورت مصور در وبلاگ زیر بیان شده است:
مشاهده
همچنین از ابزارهای دیگری از این دست میتوان به برنامه رایگان CCFinder اشاره کرد: (ثبت نام دریافت آن رایگان است)
http://www.ccfinder.net