PDA

View Full Version : روش های ارتباط با دیتابیس در entity framework



samiasoft
پنج شنبه 28 دی 1396, 18:42 عصر
سلام و عرض ادب خدمت برنامه نویسان عزیز

همانطور که از عنوان تاپیک مشخص هست به دنبال این هستم که تفاوت های روش هایی که برای ارتباط با دیتابیس در انتیتی فریمورک وجود داره رو از لحاظ کاربردی بررسی کنم

الان میدونیم که تا نسخه 6 انتیتی فریمورک 3 روش برای ارتباط وجود دارد :
Database-First, Model-First, Code-First

تا اونجایی که مطالعه کردم انگار دو روش دیتابیس فرست و Model-First دیگر منسوخ شده است و همه جا از کدفرست استفاده میشود.

اخرین نسخه انتیتی فریمورک هم همان نسخه Entity Framework Core 1.0 هستش که روش کدفرست رو دنبال میکند.

سوالاتی که در این باره داشتم این هستش که :

- چگونه دستوراتی که با 3 روش Database-First, Model-First, Code-First نوشته شده است را از هم تشخیص بدیم ؟ روش کدنویسی linq هم انگار شبیه انتیتی فریمورک هست و من این 4 روش رو وقتی در کدنویسی میبنیم تفاوتهاشونو که مربوط به کدام روش هستند را نتونستم تشخیص بدم.

- تفاوت این 3 روش از لحاظ سرعت و لود دیتابیس به چه صورت هست ؟ حال چه اطلاعات دیتابیس حجیم باشید و یا چه کم حجم باشد کدام روش مناسبتر هست؟

- شما از کدام روش استفاده میکنید ؟ کلا ایا بریم سمت کد فرست ؟

ممنون میشوم دراین باره راهنمایی کنید.

parvizwpf
پنج شنبه 28 دی 1396, 20:42 عصر
برای اینکه تفاوت رو متوجه بشید بهتره شروع کنید با هر کدوم کار کردن و یه پروژه تستی زدن خودتون خواهید فهمید.
حالت linq رو کلا کنار بگذارید.
اما به لحاظ سرعت هم تکنیک هایی وجود داره که میشه بصورت تنظیمات اعمال کرد و هم اینکه حوه کوئری نویسی ها مهمه یعنی شما برای هر کاری چطوری کوئری نویسی کنید(منظور همون fluent یا linq to sql) نویسی کنید خیلی توی performance و سرعت مهمه.
اینکه چه روشی انتخاب بشه هنوز نمیشه قطعا گفت که بین روشهای ef کدوم بهتره هر شخصی نسبت به کارکرد، راحتی ، سرعت توسعه و عوامل دیگه میره سراغ روش بهینه خودش. حتی ما خودمون در برخی پروژه ها هنوز Ado.Net استفاده میکنیم. و روی اون یک فریم ورک کوچک نوشتیم

رامین مرادی
شنبه 30 دی 1396, 11:34 صبح
برای اینکه تفاوت رو متوجه بشید بهتره شروع کنید با هر کدوم کار کردن و یه پروژه تستی زدن خودتون خواهید فهمید.
حالت linq رو کلا کنار بگذارید.
اما به لحاظ سرعت هم تکنیک هایی وجود داره که میشه بصورت تنظیمات اعمال کرد و هم اینکه حوه کوئری نویسی ها مهمه یعنی شما برای هر کاری چطوری کوئری نویسی کنید(منظور همون fluent یا linq to sql) نویسی کنید خیلی توی performance و سرعت مهمه.
اینکه چه روشی انتخاب بشه هنوز نمیشه قطعا گفت که بین روشهای ef کدوم بهتره هر شخصی نسبت به کارکرد، راحتی ، سرعت توسعه و عوامل دیگه میره سراغ روش بهینه خودش. حتی ما خودمون در برخی پروژه ها هنوز Ado.Net استفاده میکنیم. و روی اون یک فریم ورک کوچک نوشتیم

یک منبع خوب برای code first ممنون میشم معرفی کنید.

همچنین خود شما کدوم روش رو در انتیتی میپسندید. خودم که عاشق ado.net هستم :لبخند:

mr.sirwan
شنبه 30 دی 1396, 12:13 عصر
یک منبع خوب برای code first ممنون میشم معرفی کنید.

همچنین خود شما کدوم روش رو در انتیتی میپسندید. خودم که عاشق ado.net هستم :لبخند:

حتما برین سمت کد فرست، عاشقش میشین و ado.net قبلی رو کلا میذارین کنار، همه چی با کد نویسیه دیگه لازم نیس واسه طراحی و روابط و ایندکس و اینجور چیزا هی برین توی sql server همه اینهارو سمت کد نویسی سی شارپ و توی کلاس ها مدیریت میکنین، کار با کدفرست واقعا لذت بخشه پیشنهاد میکنم سریعا سویچ کنین روی کدفرست

رامین مرادی
شنبه 30 دی 1396, 14:18 عصر
حتما برین سمت کد فرست، عاشقش میشین و ado.net قبلی رو کلا میذارین کنار، همه چی با کد نویسیه دیگه لازم نیس واسه طراحی و روابط و ایندکس و اینجور چیزا هی برین توی sql server همه اینهارو سمت کد نویسی سی شارپ و توی کلاس ها مدیریت میکنین، کار با کدفرست واقعا لذت بخشه پیشنهاد میکنم سریعا سویچ کنین روی کدفرست

خب کاش منبعی که به نظر خودتون کامل و جامع هست برای یادگیری هم بگید. فارسی باشه چه بهتر. انگلیسیم خوب نیست.

parvizwpf
شنبه 30 دی 1396, 18:05 عصر
شما چرا سری به سایت آقای نصیری نمیزنید؟
www.dotnettips.info
سپس برید به بخش های اول entrity framework
من خودم بسته به کارم انتخاب میکنم

rahmatipoor
شنبه 05 خرداد 1397, 16:15 عصر
سلام الآن کدوم یکی بهتره

danialafshari
شنبه 05 خرداد 1397, 19:57 عصر
با سلام
ببینید همه ی اینها بستگی به پروژتون و زمان تحویل و خیلی پارامتر های دیگه داره
دوستان بالا توضیحات خوبی دادن که میتونید استفاده کنید یکمم من توضیح بدم
تا اونجایی که من میدونم مایکروسافت ORM Entity رو معرفی و پیاده سازی کرد که شامل دو مدل ModelFirst و DBFirst بود که بعدش جاوا مدل CodeFirst رو معرفی کرد و مایکروسافت هم از این مدل پشتیبانی و توسعه داد چون مدل خیلی خوبی بود و الان مدل CodeFirst مایکروسافت بهتر از جاوا پیشرفت کرده و هنوز هم پشتیبانی میشه
همونطور که دوستان گفتن Performance بستگی به کد نویسی شما داره و کلاس هایی هستند که Performance این مدل رو بالا میبرن که الان دقیقاً حضور ذهن ندارم
توی Code First دیتابیس بدون دخالت SQL Management ساخته میشه یعنی بر اساس Fluent ها و Conventions هایی که براش تعریف میشه دیتابیس رو میسازه و توسط Migration ها اون رو بروزرسانی میکنه ولی در Database First مانند Ado.net و روش های قدیمیه دیگه شما اول دیتابیس رو درون SQL Server ایجاد میکنید و سپس بهش کانکت میشید و کد نویسی میکنید که در Code First اینطور نیست.و اینم بگم اگه Trace کنید میبینید که در نهایت کد تولید شده همون ADO.net هست و کار اصلی ORM هم همینه که برنامه نویس رو از مواجهه با کدهای طولانی و وقتگیر راحت میکنه که باعث میشه برنامه نویس درگیر منطق برنامه بشه نه کد برنامه. بخاطر همین میگن برنامه نویس صرفاً اون کسی نیست که با یک زبان برنامه نویسی کد میزنه بلکه ذهنش هست
code first بحث های خیلی پیشرفته ای داره که اندازه یک کلاس 10-15 جلسه میشه براش وقت گذاشت ولی ORM خوب و لذت بخشی هست.
ما هر چه به جلوتر میریم داره برنامه نویسی آسون تر میشه و توصیه بزرگان هست که برنامه نویسی برای همه... چون یک جور ورزش ذهنی هست و جهل و کمتر و از بین میبره
بحث به کجا کشیده شد :)
همونطور که همون اول گفتم بستگی به پروژتون داره مثلاً برای یک دفتر تلفن ساده یا چند فرمی و یا زمان کم، نمیاین از Code First استفاده کنند و میاین DatabaseFirst استفاده میکنند البته با CodeFirst هم میشه... حتی در بعضی از قسمت های نرم افزار هم شخصاً از ADO.Net استفاده میکنم
در جواب سازنده تاپیک هم که گفت فرق بین مدل های Entity Framework رو متوجه نمیشم بگم که روش کد نویسی در سه روش (البته model first کار نکردم ولی تا اونجایی که میدونم) فرقی نداره یعنی Insert-Delete-Update-Search و ... به یک شکل هست فقط در Code First کلاس های بیشتری دخیل هستن و Configure هایی داره برای ایجاد پایگاه داده
در خصوص منابع هم قبلاً توی تاپیکی منابعی معرفی کردم (انگلیسی) که بد نیستند میتونید جستجو کنید
امیدوارم این پست مفید باشه
موفق باشید

rahmatipoor
شنبه 05 خرداد 1397, 23:59 عصر
یک سوال برای من پیش اومده من هنوز با Entity Framework کار نکردم

فرض کنید یک جدول داریم که اطلاعات اشخاص همراه با تصویرشون ذخیره شده. و مثلا اطلاعات یک میلیون نفر رو ذخیره کردیم.
حالا یک جایی می خواهیم این اطلاعات رو لود کنیم ولی نیازی به فیلد تصویر نداریم. با توجه به اینکه حجم اطلاعات تصویر یک میلیون نفر خیلی قابل توجه میشه توی ado.net خیلی راحت می تونیم یک کوئری بزنیم یا استورپروسیجر بنویسیم و با یک سلکت ساده فقط اون فیلدهایی که نیاز داریم رو بازیابی کنیم که روی بحت سرعت خیلی تاثیر گذار هست.

اما توی یکی دو تا کلیپی که من از Entity Framework دیدم که DataBase First هم بودن چون اتوماتیک کدها رو ایجاد میکنه تمامی فیلدها رو اتوماتیک انتخاب و بازیابی میکنه.
در حالی که شما توی ado.net میتونی دو تا متد بنویسی یکی برای انتخاب لیست اطلاعات همراه با تصویر و یکی بدون تصویر و در جای مناسب از هرکدوم که نیاز دارید استفاده کنید.

می خواستم بدونم که آیا توی Entity Framework هم ما میتونیم کنترل داشته باشیم و کوئری هامون رو به صورت کامل مثل Ado.Net کنترل کنیم

با تشکر

Mahmoud.Afrad
یک شنبه 06 خرداد 1397, 00:23 صبح
یک سوال برای من پیش اومده من هنوز با Entity Framework کار نکردم

فرض کنید یک جدول داریم که اطلاعات اشخاص همراه با تصویرشون ذخیره شده. و مثلا اطلاعات یک میلیون نفر رو ذخیره کردیم.
حالا یک جایی می خواهیم این اطلاعات رو لود کنیم ولی نیازی به فیلد تصویر نداریم. با توجه به اینکه حجم اطلاعات تصویر یک میلیون نفر خیلی قابل توجه میشه توی ado.net خیلی راحت می تونیم یک کوئری بزنیم یا استورپروسیجر بنویسیم و با یک سلکت ساده فقط اون فیلدهایی که نیاز داریم رو بازیابی کنیم که روی بحت سرعت خیلی تاثیر گذار هست.

اما توی یکی دو تا کلیپی که من از Entity Framework دیدم که DataBase First هم بودن چون اتوماتیک کدها رو ایجاد میکنه تمامی فیلدها رو اتوماتیک انتخاب و بازیابی میکنه.
در حالی که شما توی ado.net میتونی دو تا متد بنویسی یکی برای انتخاب لیست اطلاعات همراه با تصویر و یکی بدون تصویر و در جای مناسب از هرکدوم که نیاز دارید استفاده کنید.

می خواستم بدونم که آیا توی Entity Framework هم ما میتونیم کنترل داشته باشیم و کوئری هامون رو به صورت کامل مثل Ado.Net کنترل کنیم

با تشکر

یک viewmodel ایجاد میکنید با پراپرتی هایی که نیاز دارید و در سلکت یه نمونه از این کلاس ایجاد کرده با مقادیر entity مقداردهی میکنید. در اینصورت فقط فیلدهای موردنظر دریافت میشوند.
اگر از ویومدل استفاده نکنید اشیاء سلکت شده anonymous type خواهند بود.
https://www.brentozar.com/archive/2016/09/select-specific-columns-entity-framework-query

danialafshari
یک شنبه 06 خرداد 1397, 01:23 صبح
یک سوال برای من پیش اومده من هنوز با Entity Framework کار نکردم

فرض کنید یک جدول داریم که اطلاعات اشخاص همراه با تصویرشون ذخیره شده. و مثلا اطلاعات یک میلیون نفر رو ذخیره کردیم.
حالا یک جایی می خواهیم این اطلاعات رو لود کنیم ولی نیازی به فیلد تصویر نداریم. با توجه به اینکه حجم اطلاعات تصویر یک میلیون نفر خیلی قابل توجه میشه توی ado.net خیلی راحت می تونیم یک کوئری بزنیم یا استورپروسیجر بنویسیم و با یک سلکت ساده فقط اون فیلدهایی که نیاز داریم رو بازیابی کنیم که روی بحت سرعت خیلی تاثیر گذار هست.

اما توی یکی دو تا کلیپی که من از Entity Framework دیدم که DataBase First هم بودن چون اتوماتیک کدها رو ایجاد میکنه تمامی فیلدها رو اتوماتیک انتخاب و بازیابی میکنه.
در حالی که شما توی ado.net میتونی دو تا متد بنویسی یکی برای انتخاب لیست اطلاعات همراه با تصویر و یکی بدون تصویر و در جای مناسب از هرکدوم که نیاز دارید استفاده کنید.

می خواستم بدونم که آیا توی Entity Framework هم ما میتونیم کنترل داشته باشیم و کوئری هامون رو به صورت کامل مثل Ado.Net کنترل کنیم

با تشکر
با سلام
همونطور که آقای Afrad گفت میشه از Anonymous Type استفاده کرد در ضمن شما حتی میتونید کوئری رو هم مثل ADO.NET به EF پاس بدید و یا از Stored Procedure ها استفاده کنید

مثال Select در EF:

var list = Db.Context.Customers.Where(p=>p.Address=="تهران").OrderBy(p=>p.LastName).Select(p => new { p.FirstName, p.LastName,p.City.CityName }).ToList();

موفق باشید