PDA

View Full Version : سوال: بروزرسانی پروژه ( آبدیت پروژه از طریق وب )



md3848
پنج شنبه 09 اردیبهشت 1400, 02:09 صبح
سلام، بعضا پروژمون مشکلاتی باگی چیزی داره رفع میکنیم یا امکان جدیدی رو اضافه میکنیم به پروژه و تغیراتی از این دست، که خب نیازه که این نسخه جدید نرم افزار رو بدیم به کاربرا، که خب یه راه اینه که نسخه جدید ( نسخه 2 مثلا ) رو بزاریم تو سایت، کاربر که داره از نسخه قدیمی ( نسخه 1 ) استفاده میکنه، باید بره تو اون سایت و نسخه جدید رو دانلود، نسخه قبلی رو پاک، و نسخه جدید رو نصب کنه که خب کاربر تو خواب بره سراغ اون سایت و نسخه جدید رو دانلود کنه :لبخند: فلذا نیازه که تو خود پروژه بیایم بررسی کنیم که نسخه جدید هستش یا نه و به کاربر اطلاع بدیم، تا اگه دوس داشت رو دکمه مربوطه کلیک کنه و نسخه جدید دانلود بشه و نصب بشه و جایگزین نسخه قبلی بشه که خب این روش بهتری هستش، اما چطور پیاده سازیش کنیم که موارد زیر توش رعایت بشه حدالمقدور :

1) توقعات من برنامه نوبس و کاربر :
1.1) تا حد امکان فایلی نرم افزار برای کاربر دانلود میکنه ( همون نسخه جدید نرم افزار )، حجمش کم باشه و فقط فایل هایی که تغییر کردن رو کاربر دانلود کنه، ممکنه 50 میگ عکس به عنوان Resource داشته باشه پروژم که خب ممکنه تا نسخه شونصد ام هم تغییر نکنه، آیا کاربر باید هرباید 50 میگ داده تکراری دانلود کنه؟ اگه بشه که فقط فایل هایی که تغییر کردن، توسط کاربر دانلود بشه که عالی میشه، اما شدنی هستش؟ :متفکر:
1.2) مشکلی از نظر دیتابیس و تنظیمات توی فایل های aaa.settings نداشته باشیم، خب یه سری جداول توی دیتابیس هستش که داده از قبل توش وجود داره و نرم افزار فقط میخونه اونا رو، ReadOnly و تغییری درشون داده نمیشه؛ اما یه سری جداول داخل دیتابیس هستش که داده های مناسب کاربر داخلشون ذخیره میشه و یه سری متغییر داخل فایل های aaa.settings هستش که داده هاش ممکنه برا من کاربر یه مقداری داشته باشه و برا کاربر دیگه یه مقدار دیگه، مثلا آخرین صفحه قرآن مطالعه شده که داخل فایل های aaa.settings قرار میگیره مثلا من تا صفحه A خوندم و یه کاربر دیگه تا صفحه B و یکیدیگه ممکنه C، مقادیر ممکنه متفاوت باشه؛ حرفم اینه که این داده های داخل فایل هایی با فرمت settings و دیتابیس با بروزرسانی نرم افزار، مشکلی براشون ایجاد نشه. :افسرده:
1.3) وقتی کاربر رو دکمه دانلود کلیک کرد، نسخه قدیمی پاک بشه، نسخه جدید بجاش نصب بشه، محل نصب هم تغییر نکنه، یه شورتکات هم بندازه تو دسکتاپ :لبخند:
1.4) بعضی وقتا کد پروژه تغییر میکنه، بعضی وقتا ممکنه دیتابیس هم تغییر کنه، اطلاعات بعضی جداول Readonly تغییر بکنه و اصلاح بشه و یا یه جدول حذف و یا اضافه بشه و تغییراتی از این دست.

2) انواع روش بروزرسانی :
2.1) خب یه سری نرم افزارا مثلا مثل Filezilla وقتی نسخه جدیدی باشه، خودش دانلود میکنه و در اجرای بعدی پروژه، به کاربر میگه این نسخه جدیدو دانلود کردم، میخوای برات نصبش کنم! ( یعنی بنظرم باید خودش فایلی که دانلود کرده رو، نصبش هم بکنه دیگه، پرسش از کاربر دیگه چیه آخه! مگه موقع دانلودش سوال کردی از ما! :لبخند: )،
2.2) اما یه سری از نرم افزار های دیگه یه دکمه ( معمولا تو منو Help، بالای نرم افزار ) دارن که روشون کلیک میکنه برای بررسی وجود نسخه جدید؛
2.3) معمولا اکثر نرم افزار ها یه گزینه ( تو تنظیماتشون ) دارن که بررسی دوره ای وجود نسخه جدید، که مثلا ساعتی یکبار باشه، روزانه باشه، هر مقوع نرم افزار اجرا شد بره بررسی کنه که نسخه جدیدی هستش یا نه، یا کلا بررسی نکنه ( که خب معمولا خودم میزارمش رو گزینه : بررسی نکن :لبخند: که یوقت مشکلی برا کرک پیش نیاد، از قسمت فایروال هم دسترسیشو مسدود میکنم به اینترنت برا اطمینان بیشتر :لبخند: )
نتیجه : خب ما میتونیم از تمام این 3 روش استفاده کنیم، که یه سری تنظیمات تو پروژه بزاریم که بررسی دوره ای بروزرسانی چندوقت یکبار انجام بشه، خودش خودکار دانلود کنه یا از کاربر اجازه بگیره، خودش خودکار نصب کنه و یا از کاربر اجازه بگیره و... هرطوری حال کردیم میشه کدشو زد، این قسمت مشکلی نداریم :لبخند:

3) اما، اصل داستان، نحوه پیاده سازی بروزرسانی برای پروژه :
خب حالا چطوری این داستان بروزرسانی رو اجرایی کنیم که اون قسمت ( توقعات ) هم لحاظ بشه؟ روش هایی که میدونم وجود داره رو در زیر میگم، روش بهتری اگه سراغ دارید ذکر کنید لطفا :
3.1) یه روش که به ذهنم میرسه اینه که یه کدی سمت PHP بزنیم و فایل هارو تو هاست قرار بدیم، پروژه سمت کاربر یه درخواست میده به سرور و نسخه خودشو هم تو درخواست ذکر میکنه، تو سمت سرور بررسی میکنم که نرم افزار کاربر آبدیت هستش یا نه، اگه آبدیت بود که هیچ، وگرنه یه لینک دانلود، و سری متن ( که حاوی تغییرات نسخه جدید هستش ) برای کاربر ارسال میکنیم و پروژه سمت کاربر هم این موضوع وجود نسخه جدید رو به کاربر نشون میده و کاربر دوست داشت دکمه دانلودو میزنه و برنامشو بروزرسانی میکنه و...؛ که تو این لینک یه نمونه آموزش رو مشاهده میکنید : بررسی بروزرسانی نرم افزار با استفاده از C#‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ ‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ ‎‎‎‎‎ و PHP (https://peymanm.blog.ir/1394/06/28/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D8%A8%D8%B1%D9%88%D8%B2%D8%B1%D8%B3%D8%A7%D9%86%D B%8C-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-C-%D9%88-PHP)، اینم یه نمونه لینک دیگه که توش یه کد آماده هستش : Code to check for updates, install new version of app (https://stackoverflow.com/questions/4907425/code-to-check-for-updates-install-new-version-of-app)
3.2) اما یه روشی که اکثر مطالب توی نت فارسی بهش پرداختن بحث ClickOnce Update تو قسمت Publish پروژه هستش ( که خب قابلیت خود ویژوال استدیو هستش )، که خب از قیافش و ظاهرش که بررسی میکنه بروزرسانی رو، من تا حالا تو هیچ نرم افزاری ندیدم که این مدلی باشه، حالا شاید خیلی از نرم افزار ها از همین روش استفاده کردن ولی ظاهر داستان رو تغییر دادن و... نمونه مطلب آموزش این داستان ( فیلم ) : آپدیت نرم افزار از طریق وب در سی شارپ (https://learnfiles.com/course/%D8%A2%D9%BE%D8%AF%DB%8C%D8%AA-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-%D8%A7%D8%B2-%D8%B7%D8%B1%DB%8C%D9%82-%D9%88%D8%A8-%D8%AF%D8%B1-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE/)، یه مطلب مرتبط دیگه : Adding automatic updates to your program - Part 1 (https://www.codeproject.com/Articles/19623/Adding-automatic-updates-to-your-program-Part-1)
3.3) یه چند تا کتابخونه تو github پیدا کردم که فک کنم برا همین موضوع باشن، حالا این که از چه روشی اینا استفاده میکنن و.. رو نیمدونم ولی فک کنم شبیه همین مورد 1 که در بالا ذکر کردم باشه روال کارشون :
3.3.1) squirrel.windows (https://github.com/Squirrel/Squirrel.Windows) : تو این مورد هر نسخه از پروژه تبدیل به یه ناگت پکیج میشه فایل اجرایی طبق این ناگت پکیج ها تشخیص میده که بروزرسانی موجوده یا نه، حالا چرا از ناگت پکیج استفاده کرده رو نیمدونم چه مزایایی داره و... رو نیمدونم؛ بزرگترین مشکلی که فعلا داره اینه که با DOT-NET-FRAMEWORK سازگاره فقط! ولی با DOT-NET-CORE ( نسخه 3 ) و DOT-NET ( نسخه 5 ) سازگار نی، این ماکروسافت هم با اسمای DOT-NET بازی میکنه و آدمو گیج میکنه ( احتملا اسم نسخه 7 بشه DOT !!!! والا )؛ در هر صورت من با این کتابخونه اصلا حال نکردم، شما رو نمیدونم؛ آموزش مرتبط با این کتابخونه : C#‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ ‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ Desktop App Deployment with Squirrel - Easier than MSI Files, Better than ClickOnce (https://www.youtube.com/watch?v=W8Qu4qMJyh4)
3.3.2) NetSparkle (https://github.com/NetSparkleUpdater/NetSparkle) : ...
3.3.3) NAppUpdate (https://github.com/synhershko/NAppUpdate) : ...
3.3.4) AutoUpdater.NET (https://github.com/ravibpatel/AutoUpdater.NET) : خب این کتابخونه طبق اسنادش تو سایت github شبیه روشی که در قسمت 3.1 ذکر کردم رو اومده استفاده کرده، تقریبا میشه گفت همونی که من تو ذهنم بود رو اومده پیاده سازی کرده، پارامتر هاش به این صورته : 1) version : که نسخه نرم افزار رو تعیین میکنه 2) url : لینک دانلود فایل zip نسخه جدید ( یا هر فرمت از پیش تعریف شده دیگه ای ) 3) changelog : لیست تغییرات نسخه فوق ( یه چند خط توضیحات فرضش کنید فعلا ) 4) mandatory : آیا دانلود کردن این نسخه اجرای هستش یا اختیاری ( مثلا یه باگ خفن دارید تو پروژه، باگو رفع میکنید، و نسخه جدیدو که انتشار میدید، این گزینه رو روی yes/true قرار میدید ) و پارامترهای دیگه که جاش تو این پست نی ذکر کنم؛ بعد پروژه کاربر درخواست به سرور که ارسال میکنه ( که توش نسخه پروژه کاربر هم ذکر شده )، کد سمت سرور بررسی میکنه که نرم افزار آبدیت هستش یا نه، اگه نبود، فایل xml / json رو براش ارسال میکنه. وسلام.
3.3.5) SharpUpdate (https://github.com/henryxrl/SharpUpdate) : خب این مثل همون مورد 3.3.4 هستش، برای این میزارمش فقط چون یه سری فیلم آموزش کامل و توضیح کداش تو یوتیوب هستش، لینک لیست پخش ویدئوهای فوق رو میزارم شاید بکار کسی اومد! ( حدود 11 تا کلیپ در کل حدود 70 دقیقه ) : C#‎‎‎‎ Auto Updater Library Tutorial (https://www.youtube.com/watch?v=325Uxy5nVI0&list=PL3iOx6lykrwqc_KuJWIU3yAyTP2C7h_xE)
3.4) یه سایت دیدم که نرم افزار درست کرده بود و برای فروش گزاشته بود مرتبط با این موضوع، هنوز کامل بررسیش نکردم ولی لینکشو فعلا میزارم تا یادم نره : wyBuild (https://wyday.com/wybuild/help/automatic-updates/)

انتها : خودم بنظرم روش 3.1 ( یا کتابخونه آماده 3.3.4، که جفت روشا یکی هستش ) مناسب باشه، و بهترین روش باشه ( دلم میگه، مطمئن نیستم :لبخند: ) ولی آیا اون توقعات 1.1 و 1.2 و 1.3 و 1.4 رو میشه براورده کرد؟ یا این که نمیشه و به مشکل میخورم و اگه به مشکل میخورم چطور باید رفعش کرد یا از یه روشی باید استفاده کرد؟ خودتون برا این بحث بروزرسانی پروژه چیکار میکنید؟

پیشاپیش ممنون بابت خودت این توضیحات طولانی و پاسخ هاتون :لبخند: :قلب:

336699
پنج شنبه 09 اردیبهشت 1400, 09:31 صبح
سلام یه مورد اینکه برنامه را طوری بنویسید که نیاز به نصب پیش نیازهای چند گیگی نداشته باشه

با توجه به تاپیکهای قبلی شما، برنامه شما نیازی به دیتابیس SQL server نداره و با دیتابیس sqlite هم کار شما انجام میشه، با این تفاوت که کاربر دیگه مجبور نیست چند گیگ اس کیو ال سرور نصب کنه.

در مورد حجم آپدیت هم اگر عکسهای شما داخل فایل exe برنامه هستش
میتوانید عکسها رو داخل فایل dll قرار بدید و هر موقع لازم شد آپدیت نمایید.

barnamenevisjavan
پنج شنبه 09 اردیبهشت 1400, 10:12 صبح
سلام، بعضا پروژمون مشکلاتی باگی چیزی داره رفع میکنیم یا امکان جدیدی رو اضافه میکنیم به پروژه و تغیراتی از این دست، که خب نیازه که این نسخه جدید نرم افزار رو بدیم به کاربرا، که خب یه راه اینه که نسخه جدید ( نسخه 2 مثلا ) رو بزاریم تو سایت، کاربر که داره از نسخه قدیمی ( نسخه 1 ) استفاده میکنه، باید بره تو اون سایت و نسخه جدید رو دانلود، نسخه قبلی رو پاک، و نسخه جدید رو نصب کنه که خب کاربر تو خواب بره سراغ اون سایت و نسخه جدید رو دانلود کنه :لبخند: فلذا نیازه که تو خود پروژه بیایم بررسی کنیم که نسخه جدید هستش یا نه و به کاربر اطلاع بدیم، تا اگه دوس داشت رو دکمه مربوطه کلیک کنه و نسخه جدید دانلود بشه و نصب بشه و جایگزین نسخه قبلی بشه که خب این روش بهتری هستش، اما چطور پیاده سازیش کنیم که موارد زیر توش رعایت بشه حدالمقدور :

1) توقعات من برنامه نوبس و کاربر :
1.1) تا حد امکان فایلی نرم افزار برای کاربر دانلود میکنه ( همون نسخه جدید نرم افزار )، حجمش کم باشه و فقط فایل هایی که تغییر کردن رو کاربر دانلود کنه، ممکنه 50 میگ عکس به عنوان Resource داشته باشه پروژم که خب ممکنه تا نسخه شونصد ام هم تغییر نکنه، آیا کاربر باید هرباید 50 میگ داده تکراری دانلود کنه؟ اگه بشه که فقط فایل هایی که تغییر کردن، توسط کاربر دانلود بشه که عالی میشه، اما شدنی هستش؟ :متفکر:
1.2) مشکلی از نظر دیتابیس و تنظیمات توی فایل های aaa.settings نداشته باشیم، خب یه سری جداول توی دیتابیس هستش که داده از قبل توش وجود داره و نرم افزار فقط میخونه اونا رو، ReadOnly و تغییری درشون داده نمیشه؛ اما یه سری جداول داخل دیتابیس هستش که داده های مناسب کاربر داخلشون ذخیره میشه و یه سری متغییر داخل فایل های aaa.settings هستش که داده هاش ممکنه برا من کاربر یه مقداری داشته باشه و برا کاربر دیگه یه مقدار دیگه، مثلا آخرین صفحه قرآن مطالعه شده که داخل فایل های aaa.settings قرار میگیره مثلا من تا صفحه A خوندم و یه کاربر دیگه تا صفحه B و یکیدیگه ممکنه C، مقادیر ممکنه متفاوت باشه؛ حرفم اینه که این داده های داخل فایل هایی با فرمت settings و دیتابیس با بروزرسانی نرم افزار، مشکلی براشون ایجاد نشه. :افسرده:
1.3) وقتی کاربر رو دکمه دانلود کلیک کرد، نسخه قدیمی پاک بشه، نسخه جدید بجاش نصب بشه، محل نصب هم تغییر نکنه، یه شورتکات هم بندازه تو دسکتاپ :لبخند:
1.4) بعضی وقتا کد پروژه تغییر میکنه، بعضی وقتا ممکنه دیتابیس هم تغییر کنه، اطلاعات بعضی جداول Readonly تغییر بکنه و اصلاح بشه و یا یه جدول حذف و یا اضافه بشه و تغییراتی از این دست.

2) انواع روش بروزرسانی :
2.1) خب یه سری نرم افزارا مثلا مثل Filezilla وقتی نسخه جدیدی باشه، خودش دانلود میکنه و در اجرای بعدی پروژه، به کاربر میگه این نسخه جدیدو دانلود کردم، میخوای برات نصبش کنم! ( یعنی بنظرم باید خودش فایلی که دانلود کرده رو، نصبش هم بکنه دیگه، پرسش از کاربر دیگه چیه آخه! مگه موقع دانلودش سوال کردی از ما! :لبخند: )،
2.2) اما یه سری از نرم افزار های دیگه یه دکمه ( معمولا تو منو Help، بالای نرم افزار ) دارن که روشون کلیک میکنه برای بررسی وجود نسخه جدید؛
2.3) معمولا اکثر نرم افزار ها یه گزینه ( تو تنظیماتشون ) دارن که بررسی دوره ای وجود نسخه جدید، که مثلا ساعتی یکبار باشه، روزانه باشه، هر مقوع نرم افزار اجرا شد بره بررسی کنه که نسخه جدیدی هستش یا نه، یا کلا بررسی نکنه ( که خب معمولا خودم میزارمش رو گزینه : بررسی نکن :لبخند: که یوقت مشکلی برا کرک پیش نیاد، از قسمت فایروال هم دسترسیشو مسدود میکنم به اینترنت برا اطمینان بیشتر :لبخند: )
نتیجه : خب ما میتونیم از تمام این 3 روش استفاده کنیم، که یه سری تنظیمات تو پروژه بزاریم که بررسی دوره ای بروزرسانی چندوقت یکبار انجام بشه، خودش خودکار دانلود کنه یا از کاربر اجازه بگیره، خودش خودکار نصب کنه و یا از کاربر اجازه بگیره و... هرطوری حال کردیم میشه کدشو زد، این قسمت مشکلی نداریم :لبخند:

3) اما، اصل داستان، نحوه پیاده سازی بروزرسانی برای پروژه :
خب حالا چطوری این داستان بروزرسانی رو اجرایی کنیم که اون قسمت ( توقعات ) هم لحاظ بشه؟ روش هایی که میدونم وجود داره رو در زیر میگم، روش بهتری اگه سراغ دارید ذکر کنید لطفا :
3.1) یه روش که به ذهنم میرسه اینه که یه کدی سمت PHP بزنیم و فایل هارو تو هاست قرار بدیم، پروژه سمت کاربر یه درخواست میده به سرور و نسخه خودشو هم تو درخواست ذکر میکنه، تو سمت سرور بررسی میکنم که نرم افزار کاربر آبدیت هستش یا نه، اگه آبدیت بود که هیچ، وگرنه یه لینک دانلود، و سری متن ( که حاوی تغییرات نسخه جدید هستش ) برای کاربر ارسال میکنیم و پروژه سمت کاربر هم این موضوع وجود نسخه جدید رو به کاربر نشون میده و کاربر دوست داشت دکمه دانلودو میزنه و برنامشو بروزرسانی میکنه و...؛ که تو این لینک یه نمونه آموزش رو مشاهده میکنید : بررسی بروزرسانی نرم افزار با استفاده از C#‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ ‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ ‎‎‎‎‎‎ و PHP (https://peymanm.blog.ir/1394/06/28/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D8%A8%D8%B1%D9%88%D8%B2%D8%B1%D8%B3%D8%A7%D9%86%D B%8C-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-C-%D9%88-PHP)، اینم یه نمونه لینک دیگه که توش یه کد آماده هستش : Code to check for updates, install new version of app (https://stackoverflow.com/questions/4907425/code-to-check-for-updates-install-new-version-of-app)
3.2) اما یه روشی که اکثر مطالب توی نت فارسی بهش پرداختن بحث ClickOnce Update تو قسمت Publish پروژه هستش ( که خب قابلیت خود ویژوال استدیو هستش )، که خب از قیافش و ظاهرش که بررسی میکنه بروزرسانی رو، من تا حالا تو هیچ نرم افزاری ندیدم که این مدلی باشه، حالا شاید خیلی از نرم افزار ها از همین روش استفاده کردن ولی ظاهر داستان رو تغییر دادن و... نمونه مطلب آموزش این داستان ( فیلم ) : آپدیت نرم افزار از طریق وب در سی شارپ (https://learnfiles.com/course/%D8%A2%D9%BE%D8%AF%DB%8C%D8%AA-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-%D8%A7%D8%B2-%D8%B7%D8%B1%DB%8C%D9%82-%D9%88%D8%A8-%D8%AF%D8%B1-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE/)، یه مطلب مرتبط دیگه : Adding automatic updates to your program - Part 1 (https://www.codeproject.com/Articles/19623/Adding-automatic-updates-to-your-program-Part-1)
3.3) یه چند تا کتابخونه تو github پیدا کردم که فک کنم برا همین موضوع باشن، حالا این که از چه روشی اینا استفاده میکنن و.. رو نیمدونم ولی فک کنم شبیه همین مورد 1 که در بالا ذکر کردم باشه روال کارشون :
3.3.1) squirrel.windows (https://github.com/Squirrel/Squirrel.Windows) : تو این مورد هر نسخه از پروژه تبدیل به یه ناگت پکیج میشه فایل اجرایی طبق این ناگت پکیج ها تشخیص میده که بروزرسانی موجوده یا نه، حالا چرا از ناگت پکیج استفاده کرده رو نیمدونم چه مزایایی داره و... رو نیمدونم؛ بزرگترین مشکلی که فعلا داره اینه که با DOT-NET-FRAMEWORK سازگاره فقط! ولی با DOT-NET-CORE ( نسخه 3 ) و DOT-NET ( نسخه 5 ) سازگار نی، این ماکروسافت هم با اسمای DOT-NET بازی میکنه و آدمو گیج میکنه ( احتملا اسم نسخه 7 بشه DOT !!!! والا )؛ در هر صورت من با این کتابخونه اصلا حال نکردم، شما رو نمیدونم؛ آموزش مرتبط با این کتابخونه : C#‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ ‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ Desktop App Deployment with Squirrel - Easier than MSI Files, Better than ClickOnce (https://www.youtube.com/watch?v=W8Qu4qMJyh4)
3.3.2) NetSparkle (https://github.com/NetSparkleUpdater/NetSparkle) : ...
3.3.3) NAppUpdate (https://github.com/synhershko/NAppUpdate) : ...
3.3.4) AutoUpdater.NET (https://github.com/ravibpatel/AutoUpdater.NET) : خب این کتابخونه طبق اسنادش تو سایت github شبیه روشی که در قسمت 3.1 ذکر کردم رو اومده استفاده کرده، تقریبا میشه گفت همونی که من تو ذهنم بود رو اومده پیاده سازی کرده، پارامتر هاش به این صورته : 1) version : که نسخه نرم افزار رو تعیین میکنه 2) url : لینک دانلود فایل zip نسخه جدید ( یا هر فرمت از پیش تعریف شده دیگه ای ) 3) changelog : لیست تغییرات نسخه فوق ( یه چند خط توضیحات فرضش کنید فعلا ) 4) mandatory : آیا دانلود کردن این نسخه اجرای هستش یا اختیاری ( مثلا یه باگ خفن دارید تو پروژه، باگو رفع میکنید، و نسخه جدیدو که انتشار میدید، این گزینه رو روی yes/true قرار میدید ) و پارامترهای دیگه که جاش تو این پست نی ذکر کنم؛ بعد پروژه کاربر درخواست به سرور که ارسال میکنه ( که توش نسخه پروژه کاربر هم ذکر شده )، کد سمت سرور بررسی میکنه که نرم افزار آبدیت هستش یا نه، اگه نبود، فایل xml / json رو براش ارسال میکنه. وسلام.
3.3.5) SharpUpdate (https://github.com/henryxrl/SharpUpdate) : خب این مثل همون مورد 3.3.4 هستش، برای این میزارمش فقط چون یه سری فیلم آموزش کامل و توضیح کداش تو یوتیوب هستش، لینک لیست پخش ویدئوهای فوق رو میزارم شاید بکار کسی اومد! ( حدود 11 تا کلیپ در کل حدود 70 دقیقه ) : C#‎‎‎‎‎ Auto Updater Library Tutorial (https://www.youtube.com/watch?v=325Uxy5nVI0&list=PL3iOx6lykrwqc_KuJWIU3yAyTP2C7h_xE)
3.4) یه سایت دیدم که نرم افزار درست کرده بود و برای فروش گزاشته بود مرتبط با این موضوع، هنوز کامل بررسیش نکردم ولی لینکشو فعلا میزارم تا یادم نره : wyBuild (https://wyday.com/wybuild/help/automatic-updates/)

انتها : خودم بنظرم روش 3.1 ( یا کتابخونه آماده 3.3.4، که جفت روشا یکی هستش ) مناسب باشه، و بهترین روش باشه ( دلم میگه، مطمئن نیستم :لبخند: ) ولی آیا اون توقعات 1.1 و 1.2 و 1.3 و 1.4 رو میشه براورده کرد؟ یا این که نمیشه و به مشکل میخورم و اگه به مشکل میخورم چطور باید رفعش کرد یا از یه روشی باید استفاده کرد؟ خودتون برا این بحث بروزرسانی پروژه چیکار میکنید؟

پیشاپیش ممنون بابت خودت این توضیحات طولانی و پاسخ هاتون :لبخند: :قلب:
سلام
1- برای این کار شما میتونید بخش های مختلف برنامه رو در یک فایل dll ایجاد کنید بنابر این میتونید فقط فایل های تغییر داده شده رو به عنوان اپدیت قرار بدید
2-بهتره شما از روش دیگه ای برای ذخیره کردن تنظیمات استفاده کنید پیشنهاد من به شما ذخیره کردن تنظیمات داخل فایل جیسون هست یه کتابخونه عالی هم برای این کار وجود داره
https://github.com/nucs/JsonSettings
3-اگر بخواید خود اپدیتر رو در برنامه اصلی قرار بدید امکان حذف کردن نیست چون پروسس در حال اجراست و نمیتونه خودش رو حذف کنه، برای همین شما باید اپدیتر رو در یک برنامه جداگونه ایجاد کنید، اینجوری میتونید فایل قبلی رو پاک و جدید رو جایگزین کنید.
4-برای هماهنگی با تغییرات دیتابیس شما باید از Migration در انتیتی فریمورک استفاده کنید انتیتی بصورت خودکار جداول شما رو بدون از دست رفتن اطلاعات به تغییرات جدیدتر ارتقا میده
----------
من خودم از این روش استفاده میکنم:
یه مخزن تو گیتهاب ایجاد کنید
نسخه جدید برنامه رو در قسمت Release ایجاد کنید و فایل اپدیت که بصورت زیپ شده هست رو اونجا اپلود کنید
کاربر داخل برنامه اصلی روی دکمه مشخصی کلیک میکنه تا از طریق API گیتهاب بخش ریلیز چک بشه که ایا نسخه جدید موجوده یا نه، در صورتی که نسخه جدید موجود بود برنامه اپدیتر بهمراه پارامترهای لینک دانلود و... اجرا میشه و برنامه اصلی بسته میشه بعد از دانلود فایل اپدیت از زیپ خارج کنید و نسخه قبلی رو پاک و نسخه جدید رو جایگزین کنید
اگر خواستید برای پیاده سازی ارتباط با گیتهاب و مقایسه نسخه ها میتونم راهنمایی کنم

md3848
پنج شنبه 09 اردیبهشت 1400, 11:09 صبح
2-بهتره شما از روش دیگه ای برای ذخیره کردن تنظیمات استفاده کنید پیشنهاد من به شما ذخیره کردن تنظیمات داخل فایل جیسون هست یه کتابخونه عالی هم برای این کار وجود داره
چه فرقی داره؟ که تنظیمات پروژه، مواردی مثل آخرین صفحه مطالعه شده و یا حتی موارد داخل Page تنظیمات پروژه، داخل فایل .settings ذخیره بشن یا داخل فایل .json ؟؟؟

barnamenevisjavan
پنج شنبه 09 اردیبهشت 1400, 11:40 صبح
چه فرقی داره؟ که تنظیمات پروژه، مواردی مثل آخرین صفحه مطالعه شده و یا حتی موارد داخل Page تنظیمات پروژه، داخل فایل .settings ذخیره بشن یا داخل فایل .json ؟؟؟
فرق زیادی داره، فایل setting انعطاف پذیر نیست، امکان از بین رفتنش با تغییر برنامه هست، حتما باید در کنار فایل اجرایی باشه، حالا اگر برنامه در درایو سی یا جایی که نیاز به دسترسی ادمین باشه امکان ثبت تغییرات نیست، گاهی اوقات امکان ثبت اطلاعات تو در تو و پیچیده نیست، فایلش خوانا نیست و....
ولی اگر داخل جیسون ذخیره کنید، (البته گزینه زیاد دارید مثل xml، ini، یا فرمت باینری ولی جیسون از همشون ساده تر و بهتر هست) هم فایل خوانا هستش، هم امکان استفاده در هر مسیری رو داره، قابلیت رمزنگاری داره، هر نوع داده ای رو میتونید داخلش ذخیره کنید
این یه نمونه هستش که میتونید ببینید
https://s2.uupload.ir/files/untitled_ezn3.png

md3848
پنج شنبه 09 اردیبهشت 1400, 23:36 عصر
3-اگر بخواید خود اپدیتر رو در برنامه اصلی قرار بدید امکان حذف کردن نیست چون پروسس در حال اجراست و نمیتونه خودش رو حذف کنه، برای همین شما باید اپدیتر رو در یک برنامه جداگونه ایجاد کنید، اینجوری میتونید فایل قبلی رو پاک و جدید رو جایگزین کنید.
آره همین کارو میکنم، یه پروژه جدید مخصوص بروزرسانی "پروژه اصلی" تو سولوش ام ایجاد کردم.


4-برای هماهنگی با تغییرات دیتابیس شما باید از Migration در انتیتی فریمورک استفاده کنید انتیتی بصورت خودکار جداول شما رو بدون از دست رفتن اطلاعات به تغییرات جدیدتر ارتقا میده
1) این Entity Frameowrk به دیتابیس خاصی وابسته هستش؟ یا با هر دیتابیسی میشه ازش استفاده کرد؟
2) فرق Entity Frameowrk با linq-to-sql.dbml چیه؟ ( تو نت خوندم که linq-to-sql.dbml خودش جزئی از ado.net هستش؛ کم کم دارم گیج میشم با این اصلاحات :افسرده: )
3) الان تو کد زیر من از چه روشی برا کدنویسی دسترسی به دیتابیس استفاده کردم؟ :گریه::گیج: یه کلاس مدل تعریف کردم ( که دقیقا همون ستون های دیتابیس هستش ) و داده ای بخوام از دیتابیس بخونم یا بنویسم از این کلاس استفاده میکنم.
public static class TbNotifications{
#region Model
public class Model
{
public int ID { get; set; }
public string Title { get; set; }
public string Summary { get; set; }
public string Image { get; set; }
public string Time { get; set; }
public string Date { get; set; }
public string Content { get; set; }
public bool WillBeShown { get; set; }
}
#endregion


#region Functions
public static List<Model> ReadAllNotifications()
{
List<Model> data = new List<Model>();


try
{
using (SqlConnection conn = new SqlConnection(Database.Connetion))
{
conn.Open();
if (conn.State == System.Data.ConnectionState.Open)
{
using (SqlCommand cmd = conn.CreateCommand())
{
string query =
" SELECT *" +
" FROM TbNotifications";


cmd.CommandText = query;


using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
data.Add(new Model
{
ID = (int)reader["ID"],
Title = reader["Title"].ToString(),
Summary = reader["Summary"].ToString(),
Image = reader["Image"].ToString(),
Time = reader["Time"].ToString(),
Date = reader["Date"].ToString(),
Content = reader["Content"].ToString(),
WillBeShown = (bool)reader["WillBeShown"],
});
}
}
}
}
}
}
catch (Exception ex)
{
Debug.WriteLine("Exception: " + ex.Message);
}


return data;
}
#endregion
}

barnamenevisjavan
جمعه 10 اردیبهشت 1400, 00:13 صبح
آره همین کارو میکنم، یه پروژه جدید مخصوص بروزرسانی "پروژه اصلی" تو سولوش ام ایجاد کردم.


1) این Entity Frameowrk به دیتابیس خاصی وابسته هستش؟ یا با هر دیتابیسی میشه ازش استفاده کرد؟
2) فرق Entity Frameowrk با linq-to-sql.dbml چیه؟ ( تو نت خوندم که linq-to-sql.dbml خودش جزئی از ado.net هستش؛ کم کم دارم گیج میشم با این اصلاحات :افسرده: )
3) الان تو کد زیر من از چه روشی برا کدنویسی دسترسی به دیتابیس استفاده کردم؟ :گریه::گیج: یه کلاس مدل تعریف کردم ( که دقیقا همون ستون های دیتابیس هستش ) و داده ای بخوام از دیتابیس بخونم یا بنویسم از این کلاس استفاده میکنم.
public static class TbNotifications{
#region Model
public class Model
{
public int ID { get; set; }
public string Title { get; set; }
public string Summary { get; set; }
public string Image { get; set; }
public string Time { get; set; }
public string Date { get; set; }
public string Content { get; set; }
public bool WillBeShown { get; set; }
}
#endregion


#region Functions
public static List<Model> ReadAllNotifications()
{
List<Model> data = new List<Model>();


try
{
using (SqlConnection conn = new SqlConnection(Database.Connetion))
{
conn.Open();
if (conn.State == System.Data.ConnectionState.Open)
{
using (SqlCommand cmd = conn.CreateCommand())
{
string query =
" SELECT *" +
" FROM TbNotifications";


cmd.CommandText = query;


using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
data.Add(new Model
{
ID = (int)reader["ID"],
Title = reader["Title"].ToString(),
Summary = reader["Summary"].ToString(),
Image = reader["Image"].ToString(),
Time = reader["Time"].ToString(),
Date = reader["Date"].ToString(),
Content = reader["Content"].ToString(),
WillBeShown = (bool)reader["WillBeShown"],
});
}
}
}
}
}
}
catch (Exception ex)
{
Debug.WriteLine("Exception: " + ex.Message);
}


return data;
}
#endregion
}
شما میتونید با هر دیتابیسی که خواستید کار کنید، محدودیتی نیست لیست پرووایدر هارو اینجا ببینید
Database Providers - EF Core | Microsoft Docs (https://docs.microsoft.com/en-us/ef/core/providers/?tabs=dotnet-core-cli)
شما همه روش های ارتباطی دیتابیس رو فراموش کنید و فقط روی انتیتی فریمورک متمرکز بشید، جدیدترین و بهترین روش اتصال دیتابیس هست و همه جای دنیا از انتیتی استفاده میکنن و روش های دیگه کم کم منسوخ شده
ببینید خود انتیتی روش های مختلفی برای ارتباط با دیتابیس داره که به مرور زمان معرفی شدن و هرکدوم امکانات بیشتری رو ارائه کرده، در حال حاظر اخرین و بهترین روش کد فرست هست روش شما هم فک کنم همون انتیتی باشه (من فقط با کد فرست کار کردم) حالا ممکنه دیتابیس فرست باشه یا...
توی کد فرست شما خیلی ساده تر و سریعتر میتونید با دیتابیس ارتباط برقرار کنید در واقع برای واکشی اطلاعات از linq استفاده میشه
اینجا یه مقاله در مورد راه اندازی کد فرست هست که میتونید مطالعه کنید
Create SQLite DB using Entity Framework Core Code First (talkingdotnet.com) (https://www.talkingdotnet.com/create-sqlite-db-entity-framework-core-code-first/)
برای ارتباط با دیتابیس شما باید اول پروایدر دلخواهتون رو نصب کنید، خوبیش اینه که نحوه استفاده پروایدر ها هیچ فرقی با هم نداره و کدی که نوشتید برای همشون تقریبا یکسانه
---
یادم رفت بگم که اون همه کدی که شما نوشتی با کد فرست میشه 2 الی 3 خط نوشت

mr.sirwan
جمعه 10 اردیبهشت 1400, 02:34 صبح
آره همین کارو میکنم، یه پروژه جدید مخصوص بروزرسانی "پروژه اصلی" تو سولوش ام ایجاد کردم.


1) این Entity Frameowrk به دیتابیس خاصی وابسته هستش؟ یا با هر دیتابیسی میشه ازش استفاده کرد؟
2) فرق Entity Frameowrk با linq-to-sql.dbml چیه؟ ( تو نت خوندم که linq-to-sql.dbml خودش جزئی از ado.net هستش؛ کم کم دارم گیج میشم با این اصلاحات :افسرده: )
3) الان تو کد زیر من از چه روشی برا کدنویسی دسترسی به دیتابیس استفاده کردم؟ :گریه::گیج: یه کلاس مدل تعریف کردم ( که دقیقا همون ستون های دیتابیس هستش ) و داده ای بخوام از دیتابیس بخونم یا بنویسم از این کلاس استفاده میکنم.
public static class TbNotifications{
#region Model
public class Model
{
public int ID { get; set; }
public string Title { get; set; }
public string Summary { get; set; }
public string Image { get; set; }
public string Time { get; set; }
public string Date { get; set; }
public string Content { get; set; }
public bool WillBeShown { get; set; }
}
#endregion


#region Functions
public static List<Model> ReadAllNotifications()
{
List<Model> data = new List<Model>();


try
{
using (SqlConnection conn = new SqlConnection(Database.Connetion))
{
conn.Open();
if (conn.State == System.Data.ConnectionState.Open)
{
using (SqlCommand cmd = conn.CreateCommand())
{
string query =
" SELECT *" +
" FROM TbNotifications";


cmd.CommandText = query;


using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
data.Add(new Model
{
ID = (int)reader["ID"],
Title = reader["Title"].ToString(),
Summary = reader["Summary"].ToString(),
Image = reader["Image"].ToString(),
Time = reader["Time"].ToString(),
Date = reader["Date"].ToString(),
Content = reader["Content"].ToString(),
WillBeShown = (bool)reader["WillBeShown"],
});
}
}
}
}
}
}
catch (Exception ex)
{
Debug.WriteLine("Exception: " + ex.Message);
}


return data;
}
#endregion
}

1. با هر دیتابیسی از نوع رابطه ای سازگاری داره فقط لازمه که پرووایدر اون دیتابیس رو نصب داشته باشید
2. انتیتی فریمورک یک ORM هستش که کارش نگاشت یا اتصال آبجکت ها و پراپرتی های کلاس های شما به جداول و ستون های متناظر در دیتابیسه و کار شما برای ارتباط با دیتابیس رو راحت تر میکنه.
همونطور که دوستمون هم اشاره کردن، این تکنولوژی سه تا روش داره: Database-First, Model-First, Code-First که روش Code-First محبوب ترین روشه که استفاده از اون باعث میشه دیگه نیازی نباشه یه پاتون تو محیط کدنویسی ویژوال استودیو باشه و یه پاتون هم توی نرم افزار Sql Server جهت تعریف و تنظیم جدول ها، ستون ها، ریلیشن ها و ...

اما از اون طرف Linq یک تکنولوژی جهت کوئری نویسی هستش و این وسط ما از طریق Linq داخل نرم افزارمون دسترسی به داده ها رو انجام میدیم

3. روشی که شما توی کدتون استفاده میکنید، روش Ado هست و اون کلاس Model که نوشتین نقش ViewModel رو داره که صرفا داده هارو داخل آبجکتی از اون کلاس میریزین و جنبه نمایشی داره. یعنی با جدولتون داخل دیتابیس ارتباط چندانی جز همنامی و شاید یکسان بودن در نوع داده هاشون، نداره

md3848
جمعه 10 اردیبهشت 1400, 09:06 صبح
فعلا درباره EF دارم مطالعه میکنم به نتیجه که رسیدم اینجا اعلام میکنم و سوالات و مشکلات رو مطرح میکنم.

1) یه سوال : این روش کد زنی دیتابیس چیه اسمش؟ ( تو این کد اومدم یه داده از یه جدولی از دیتابیسم رو خوندم )

public static LinqToSqlDataContext databases = new LinqToSqlDataContext(connetion);

public static int AyahNumberQuran(int surahNumber, int ayahNumberSurah)
{
var record = databases.TbQurans.Where(q => q.SurahNumber == surahNumber && q.AyahNumberSurah == ayahNumberSurah).FirstOrDefault();


return record.AyahNumberQuran;
}

2) سوال آخر : برا جداولی که داده هاشون ثابته، حالا ممکنه در آینده توسط من برنامه نویس داده هاش اصلاح بشن یا ستون هاش یکی کم یا زیاد بشه یا فوقش اسم یه ستون تغییر کنه، بازم استفاده از روش Code-First مناسبشه؟ مثلا جدول آیات قرآن که یه ستون آیات قرآنه یه ستون برا اینه که این آیه سجده دار هستش یا نه و...

barnamenevisjavan
جمعه 10 اردیبهشت 1400, 11:15 صبح
فعلا درباره EF دارم مطالعه میکنم به نتیجه که رسیدم اینجا اعلام میکنم و سوالات و مشکلات رو مطرح میکنم.

1) یه سوال : این روش کد زنی دیتابیس چیه اسمش؟ ( تو این کد اومدم یه داده از یه جدولی از دیتابیسم رو خوندم )

public static LinqToSqlDataContext databases = new LinqToSqlDataContext(connetion);

public static int AyahNumberQuran(int surahNumber, int ayahNumberSurah)
{
var record = databases.TbQurans.Where(q => q.SurahNumber == surahNumber && q.AyahNumberSurah == ayahNumberSurah).FirstOrDefault();


return record.AyahNumberQuran;
}

2) سوال آخر : برا جداولی که داده هاشون ثابته، حالا ممکنه در آینده توسط من برنامه نویس داده هاش اصلاح بشن یا ستون هاش یکی کم یا زیاد بشه یا فوقش اسم یه ستون تغییر کنه، بازم استفاده از روش Code-First مناسبشه؟ مثلا جدول آیات قرآن که یه ستون آیات قرآنه یه ستون برا اینه که این آیه سجده دار هستش یا نه و...
شما دارید از linq برای واکشی اطلاعات استفاده میکنید، migration ربطی به کد فرست بودن نداره همه مدلهای انتیتی میتونن از migration استفاده کنن
در ضمن بهتره که کدتون رو بصورت زیر تغییر بدید

public static int AyahNumberQuran(int surahNumber, int ayahNumberSurah)
{
using (var context = new LinqToSqlDataContext(connetion))
{
var record = context.TbQurans.Where(q => q.SurahNumber == surahNumber && q.AyahNumberSurah == ayahNumberSurah).FirstOrDefault();


return record.AyahNumberQuran;
}
}

----
یه نکته دیگه اینکه چرا وقتی از LinqToSqlDataContext استفاده میکنید کانکشن رو هم بهش پاس میدید؟ مگه داخل کلاس context کانکشن استرینگ رو ست نکردید؟

md3848
جمعه 10 اردیبهشت 1400, 20:40 عصر
الان من میخوام از ADO .NET Entity Data Model تو Dot Net Core 5 استفاده کنم ولی نمیشه و خطا میده ( طبق فیلم ها و آموزش هایی که دیدم اکثرشون از این فایل استفاده کردن )، برا من خطای زیر رو میده؛ بنظرم فقط میشه تو Dot Net Framework ازش استفاده کرد، حالا چیکار کنم که بشه ازش تو Dot Net Core 5 استفاده کرد؟ :

153277

یه EF6 داریم که مخصوص Dot Net Framework هستش و یه EF Core که مخصوص Dot Net Core 5 هستش، و این ADO .NET Entity Data Model هم مخصوص EF6 هستش و نه EF Core، توضیحات بیشتر : Compare EF Core & EF6 (https://docs.microsoft.com/en-us/ef/efcore-and-ef6/)؛ پس سوال/مشکل بالا رو به جواب رسیدم، پاکش هم نمیکنم تا اگه کسی به مشکل خورد، سرچ کرد تو گوگل، این مطلب بالا بیاد و به جواب برسه؛ خب بگذریم.


اما سوال من؛ میشه مثلا دیتابیس قرآن که حاوی آیات قرآن هستش رو با روش Code First پیاده سازی کرد؟ هرچی فک میکنم باید از روش Database First استفاده کرد.

barnamenevisjavan
جمعه 10 اردیبهشت 1400, 20:59 عصر
الان من میخوام از ADO .NET Entity Data Model تو Dot Net Core 5 استفاده کنم ولی نمیشه و خطا میده ( طبق فیلم ها و آموزش هایی که دیدم اکثرشون از این فایل استفاده کردن )، برا من خطای زیر رو میده؛ بنظرم فقط میشه تو Dot Net Framework ازش استفاده کرد، حالا چیکار کنم که بشه ازش تو Dot Net Core 5 استفاده کرد؟ :

153277

الان من بخوام از روش Database First استفاده کنم نیاز به استفاده از این ADO .NET... دارم ( چون بعید میدونم مثلا دیتابیس قرآن که حاوی آیات قرآن هستش رو بشه با روش Code First پیاده سازی کرد )
اگه منظورتون دیتابیس اماده هستش بازم مشکلی نیست با CodeFirst میتونید کار کنید شما دیتابیست رو اینجا قرار بده من برات با کد فرست یه نمونه بزنم

md3848
جمعه 10 اردیبهشت 1400, 21:06 عصر
حتما یکی از نسخه های دات نت روی ویژوال استودیو نصب نیست، اگه منظورتون دیتابیس اماده هستش بازم مشکلی نیست با CodeFirst میتونید کار کنید شما دیتابیست رو اینجا قرار بده من برات با کد فرست یه نمونه بزنم
پستم رو ویرایش کردم، دوباره ببین، فک کنم به جواب درست رسیدم که در همون پست پیوست کردم.

لینک دانلود دیتابیس ( جدول TbQuran ) : http://up.dmf313.ir/Private/DbQuran.rar

البته همین جدول TbQuran هم یه ستون داره برا بحث یادداشت های شخصی کاربر برای هر آیه. ( غیر از این ستون، بقیه داده ها ثابته و کاربر فقط میخونه اونا رو. )

barnamenevisjavan
جمعه 10 اردیبهشت 1400, 21:42 عصر
پستم رو ویرایش کردم، دوباره ببین، فک کنم به جواب درست رسیدم که در همون پست پیوست کردم.

لینک دانلود دیتابیس ( جدول TbQuran ) : http://up.dmf313.ir/Private/DbQuran.rar

البته همین جدول TbQuran هم یه ستون داره برا بحث یادداشت های شخصی کاربر برای هر آیه. ( غیر از این ستون، بقیه داده ها ثابته و کاربر فقط میخونه اونا رو. )
اینم از پروژه نمونه
https://uupload.ir/view/wpfapp4_h2h2.rar/
اول پروژه رو یکبار ریبیلد کنید تا پکیج ناگت ریستور بشه
بعد فایل دیتابیس رو کپی کنید در کنار فایل exe
بعد میتونید برنامه رو اجرا کنید و ایتم اضافه یا اطلاعات قبلی رو لود کنید
------------------------
چند نکته:
سعی کنید جدول هاتون فیلد id داشته باشن در مثال بالا من از جدول نوتیفیکشن استفاده کردم که کلید نداشت برای همین هنگام کار با دیتابیس به مشکل میخورید راه حلش اینه که بالای کلاس اون جدول از اتریبیوت [Keyless] استفاده کنید (داخل کلاس TbNotification میتونید ببینید)
نکته دوم اینکه داخل کلاس QuranDbContext جایی که جداول معرفی میشن از اسم خود جدول برای تعریفش استفاده کنید منظورم کد زیر هست
public DbSet<TbNotifications> TbNotifications { get; set; }

دقت کنید که من اسم این پراپرتی رو TbNotifications گذاشتم که دقیقا هم نام جدول دیتابیس هست، اگر میخواید که این اسم متفاوت باشه باید در کلاس اون جدول از اتریبیوت [Table] استفاده کنید
[Table("TbNotifications ")]
public class TbNotifications

حالا شما میتونید هر اسمی که دوست داشتید هم برای کلاس هم برای پراپرتیش بزارید
---
اگر فایل دیتابیس پیدا نشه انتیتی خودش فایل دیتابیس رو همراه با جدول ها ایجاد میکنه، اگرم که دیتابیس باشه همون اطلاعات قبلی رو میخونه و دیگه دیتابیس رو ایجاد نمیکنه

md3848
شنبه 11 اردیبهشت 1400, 03:05 صبح
سوال : این کد زیر رو Static تعریف کنم و تو تمام توابعم ازش استفاده کنم بهتر نی؟ جدا حس بدی میده که این کدو تو هر تابع دارم تکرار میکنم؛ مشکلی که ایجاد نمیکنه که؟
using (var dataContext = new QuranDbContext()){
//...
}

لیست ویژگی ها :
1) Code First Data Annotations (https://docs.microsoft.com/en-us/ef/ef6/modeling/code-first/data-annotations)
2) Data Annotations Attributes (https://www.learnentityframeworkcore.com/configuration/data-annotation-attributes)

کاربرد ویژگی ها : فک کنم بیشتر برا روش code first ّبکار بیان که تعیین میکنن مثلا کدوم property برا id هستش [ Key ]، حداکثر تعداد کاراکتر هاشو تعیین کنیم [ MaxLength ]؛ یا مثلا اسم جدولو تعیین کینم [ Table ] و...؛ فک نکنم زیاد برا روش database first بکار بیان مگه این که مثلا تو دیتابیس سوتی دادی و ستون ID تعیرف نکردی و بجاش میای سمت کدهای پروژه تو اون کلاس MODEL ات، برا اون Property مدنظر از key استفاده میکنی که بگی از این به عنوان id استفاده کن، یه چی تو این مایه ها؛ درست گفتم؟

barnamenevisjavan
شنبه 11 اردیبهشت 1400, 13:49 عصر
سوال : این کد زیر رو Static تعریف کنم و تو تمام توابعم ازش استفاده کنم بهتر نی؟ جدا حس بدی میده که این کدو تو هر تابع دارم تکرار میکنم؛ مشکلی که ایجاد نمیکنه که؟
using (var dataContext = new QuranDbContext()){
//...
}

لیست ویژگی ها :
1) Code First Data Annotations (https://docs.microsoft.com/en-us/ef/ef6/modeling/code-first/data-annotations)
2) Data Annotations Attributes (https://www.learnentityframeworkcore.com/configuration/data-annotation-attributes)

کاربرد ویژگی ها : فک کنم بیشتر برا روش code first ّبکار بیان که تعیین میکنن مثلا کدوم property برا id هستش [ Key ]، حداکثر تعداد کاراکتر هاشو تعیین کنیم [ MaxLength ]؛ یا مثلا اسم جدولو تعیین کینم [ Table ] و...؛ فک نکنم زیاد برا روش database first بکار بیان مگه این که مثلا تو دیتابیس سوتی دادی و ستون ID تعیرف نکردی و بجاش میای سمت کدهای پروژه تو اون کلاس MODEL ات، برا اون Property مدنظر از key استفاده میکنی که بگی از این به عنوان id استفاده کن، یه چی تو این مایه ها؛ درست گفتم؟
چون Context خاصیت Disposable داره استفاده کردن از using باعث میشه که بصورت خودکار بعد از اتمام فرایند حافظه تمیز بشه و برنامه کمتر از منابع استفاده بکنه، استفاده از static برای همچین عملیاتی فکر نمیکنم مناسب باشه static ها هم ایرادات خودشون رو دارن، اگر نمیخواید از using استفاده کنید میتونید کد رو بدون using بنویسید
var dataContext = new
QuranDbContext();

راه حل دیگه اینه که شما از توابع جنریک استفاده کنید 2تا از تابع های افزودن و دریافت اطلاعات رو بصورت جنریک براتون مینویسم
public class DataService<T> where T : class
{
public async Task<T> Add(T entity)
{
using (var db = new QuranDbContext())
{
var created = await db.AddAsync(entity);
await db.SaveChangesAsync();
return created.Entity;
}
}


public async Task<IEnumerable<T>> GetAll()
{
using (var db = new QuranDbContext())
{
var all = await db.Set<T>().ToListAsync();
return all;
}
}
}


تابع اول میتونه به همه جدول ها داده وارد کنه و تابع دوم هم میتونه از همه جدول ها اطلاعات رو بخونه
نحوه استفاده هم به این صورت هست
برای افزودن
var newData = new TbNotifications() { Content = "test", Date = "2021", Image = "image", Summary = "sum", Time = "time", Title = "title", WillBeShown = true };


var notify = new DataService<TbNotifications>();
await notify.Add(newData);

و برای خوندن اطلاعات هم
var notify = new DataService<TbNotifications>();
var all = await notify.GetAll();


توجه کنید که من این 2 تا تابع رو بصورت async/await نوشتم بدون async هم میتونید بنویسید. حالا کافیه هر موقع توابع رو صدا میزنید اون کلاس جدول رو به DataService پاس بدید تا روی اون جدول مانور داده بشه