نمایش نتایج 1 تا 11 از 11

نام تاپیک: طراحی ویومدل با جداول چند به چند

  1. #1
    کاربر دائمی
    تاریخ عضویت
    دی 1389
    پست
    531
    تشکر کردن
    581
    25 بار تشکر شده در 22 پست

    طراحی ویومدل با جداول چند به چند

    سلام دوستان

    من میخام برای جدول جزییات محصول یک ویومدل داشته باشم .ممنون میشم بگید چطور میتونم ویومدل رو برای این جدول طراحی کنم؟

    جدول محصول با چند جدول دیگه رابطه چندبه چند داره بصورت زیر :

    product.cs

    public class Product
    {
    public int Id { get; set; }
    public string Title { get; set; }
    public string Body { get; set; }
    public virtual ICollection<ProductComment> ProductComments { get; set; } = new HashSet<ProductComment>();
    public virtual ICollection<ProductGroup> ProductGroups { get; set; } = new HashSet<ProductGroup>();
    public virtual ICollection<ProductMedia> ProductMedias { get; set; } = new HashSet<ProductMedia>();


    Media.cs

    public class Media
    {
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<ProductMedia> ProductMedias { get; set; } = new HashSet<ProductMedia>();
    }



    ProductMedia.cs

    public class ProductMedia
    {
    public int MediaId { get; set; }
    public virtual Media Media { get; set; }
    public int ProductId { get; set; }
    public virtual Product Product{ get; set; }
    public string Description { get; set; }
    }


    بقیه جداول هم روابطشون با جدول محصولات به همین صورته . میخام یه ویو مدل داشته باشم و تمام این فیلدها در اون باشه . در ویومدلهای جداوا چند به چند باید مثه کلاسها رابطه ها هم نوشته بشه؟

  2. #2
    کاربر دائمی آواتار ali_md110
    تاریخ عضویت
    فروردین 1385
    محل زندگی
    شیراز
    پست
    1,074
    تشکر کردن
    27
    749 بار تشکر شده در 532 پست

    نقل قول: طراحی ویومدل با جداول چند به چند

    ویو مدل از نامش پیداست: مدل هایی حاوی یک یا چند فیلد که برای نمایش در ویو ساخته میشوند و نیازی به ایجاد روابط یک به چند یا چند به چند ندارند
    این ویومدلها در واقع داده های واکشی شده توسط کوئری در اختیارشون قرار داده میشه و درون آنها ریخته میشه

    اگر میخواهید تمام فیلدهای دلخواهتون مثلا Title از جدول Product و Name از جدول Media و یا سایر فیلدهای دیگر همگی با یک اکشن و یک کوئری نمایش بدید همه فیلدهای مورد نیاز رو درون یک ویو مدل قرار بدید و با projction داده ها رو از دیتابیس بگیرید و در این ویومدل بریزید
    و یا اگر در صفحه مشخصات کالا جند قسمت مختلف از مشخصات کالا دارید و از پارشل ویو استفاده میکنید باید ویومدهای مختلف بسازید
    و هرکدوم جداگانه داده هاشون از دیتابیس دریافت کنند

  3. کاربرانی که به خاطر مطلب مفید ali_md110 از وی تشکر کرده‌اند:


  4. #3
    کاربر جدید
    تاریخ عضویت
    اسفند 1390
    پست
    5
    تشکر کردن
    25
    یک بار تشکر شده در یک پست

    نقل قول: طراحی ویومدل با جداول چند به چند

    سلام.
    شما باید مشخص کنید کدام آیتم ها را در ویو نیاز دارید. و سپس همان آیتم ها را در ویومدل قرار بدهید. در ویومدل ها ارتباط بین انتیتی ها نوشته نمیشود.
    شما فرض کنید برای کلاس ProductMedia میخواهید یک ویو مدل بنویسید؛ این کلاس شامل یک پراپرتی به نام Media است. اگر شما فرضا فقط به پراپرتی Name از کلاس Media نیاز داشته باشید نیازی نیست در ویو مدل پراپرتی معادل Media در کلاس مدل ProductMedia را هم داشته باشید و شما میتوانید پراپرتی جدیدی فرضا با نام MediaName در ویومدل خود داشته باشید. و در لایه ی Mapper خود مشخص کنید که منظور از MediaName پراپرتی Name از کلاس Media است.

  5. کاربرانی که به خاطر مطلب مفید 2khtarbache از وی تشکر کرده‌اند:


  6. #4
    کاربر دائمی
    تاریخ عضویت
    دی 1389
    پست
    531
    تشکر کردن
    581
    25 بار تشکر شده در 22 پست

    نقل قول: طراحی ویومدل با جداول چند به چند

    ممنون
    وقتی تعداد آیتمهای ویو مدل کم هست نیاز به projection هست ؟ اینکه من یه لیست از داده های موردنظرم رو بگیرم و بعد با استفاده از یه حلقه for ، داده های لیست رو به آیتمهای ویومدل منتقل کنم ؟

    و اینکه من میتونم یه ویومدل داشته باشم و در تعداد زیادی query ، ویومدل رو new کنم و اطلاعات query های مختلف رو توی ویومدل قرار بدم ؟

  7. #5
    کاربر دائمی آواتار ali_md110
    تاریخ عضویت
    فروردین 1385
    محل زندگی
    شیراز
    پست
    1,074
    تشکر کردن
    27
    749 بار تشکر شده در 532 پست

    نقل قول: طراحی ویومدل با جداول چند به چند

    فرقی نمیکنه شما با یک حلقه for هم میتونید viewModel را از داده پر کنید
    ولی توجه داشته باشید که اگر projetion و اونهم استفاده از ابزای مثل Automapper بکار برده بشه کارایی بسیار بالاتر خواهد رفت
    مخصوصا اینکه از ProjectTo استفاده کنید automapper بصورت اتوماتیک eager loading رابرای شما برقرار میکند و join های اضافی ها را شناسایی و صرفه نظر میکند

    جواب سوال دوم شما بله هست
    viewModel یک کلاس حاوی فیلدهای مورد نظر هست و به ازای هر new شدن یک جایی در حافظه اشغال میکند و بگارگیری چند باره آن هیچ اشکالی ندارد و سودمند هم هست

  8. کاربرانی که به خاطر مطلب مفید ali_md110 از وی تشکر کرده‌اند:


  9. #6
    کاربر دائمی
    تاریخ عضویت
    دی 1389
    پست
    531
    تشکر کردن
    581
    25 بار تشکر شده در 22 پست

    نقل قول: طراحی ویومدل با جداول چند به چند

    بسیار ممنونم .

    من برای گرفتن مقادیر از جدول محصولات و مدیا بصورت زیر عمل کردم (دو بار query گرفتم که join های کمتری داشته باشم و نمیدونم واقعا این روش درستتره یا اینکه تمام جداول رو با هم join بزنم؟) ولی تو این حالت چون مقادیر برای ویو مدل دوبار پر میشن من چطور میتونم از mapper استفاده کنم ؟


    public List<ProductViewModel> ShowNewProduct(int count)
    {
    var qNewPro = context.Products
    .OrderByDescending(c => c.Id)
    .Take(count)
    .ToList();
    List<ProductViewModel> lstNewProduct = new List<ProductViewModel>();
    foreach (var item in qNewPro)
    {
    ProductViewModel vmNewPro = new ProductViewModel();
    vmNewPro.Id = item.Id;
    vmNewPro.Title = item.Title;
    vmNewPro.ImageUrl = context.ProductMedias
    .Where(c => c.ProductId == item.Id)
    .Select(c => c.Media.Name)
    .FirstOrDefault();
    lstNewProduct.Add(vmNewPro);
    }
    return lstNewProduct ?? null;
    }



    برای متدهایی که از یک query استفاده میکنن اول سرویس mapper رو در استارت آپ فعال کردم و بعد :


    public List<GroupViewModel> ShowGroup()
    {
    var qGroup = context.Groups
    .ToList();
    return Mapper.Map<List<Group>,List<GroupViewModel>>(qGrou p) ?? null;
    }


  10. #7
    کاربر دائمی آواتار ali_md110
    تاریخ عضویت
    فروردین 1385
    محل زندگی
    شیراز
    پست
    1,074
    تشکر کردن
    27
    749 بار تشکر شده در 532 پست

    نقل قول: طراحی ویومدل با جداول چند به چند

    یک سوال؟
    شما وقتی تمام کالاهای جدید را به کاربران نمایش می دهید آیا همزمان جزئیاتشان از جدول ProductMedia را هم نشان می دهید؟
    یا اینکه کاربر با انتخاب کالا جزئیات به او نشان داده میشود؟
    اگر مورد دوم هست میتونید از این حلقه استفاده کنید ولی توجه داشته باشید که دو کوئری ارسال خواهد شد
    و اگر مورد اول هست
    شما به نظر خودتون دوبار query دارید و جوین کمتر ولی در واقع کوئری های زیادی حمله ور میشوند به سمت سرور
    این روش را به هیچ وجه بکار نبرید پیشنهاد میدم یک ابزار profiler نصب کنید و اونوقت ببینید که در حلقه ای که ساختید چند کوئری به سمت دیتابیس صادر میشود

    دستورات include و SelectMany برای مدیریت joinها و روابط Hierarchical
    هست


    context.Products.Include(m => m.ProductMedias).Select(m => view model ra inja fill konid).ToList();
    آخرین ویرایش به وسیله ali_md110 : دوشنبه 25 تیر 1397 در 22:35 عصر دلیل: بهم ریختگی کدها

  11. کاربرانی که به خاطر مطلب مفید ali_md110 از وی تشکر کرده‌اند:


  12. #8
    کاربر دائمی
    تاریخ عضویت
    دی 1389
    پست
    531
    تشکر کردن
    581
    25 بار تشکر شده در 22 پست

    نقل قول: طراحی ویومدل با جداول چند به چند

    زمانیکه من به داده های جدول Media هم نیاز دارم چطور میتونم با یک query به تمام داده ها دسترسی داشته باشم ؟

    اگر کد رو هم بصورت زیر بنویسم ، به فیلد Media.Name به چه صورتی میشه دسترسی داشت ؟



    var qNewPro = context.Products
    .Include(p => p.ProductMedias)
    .ThenInclude(p => p.Media)



    ممنونم

  13. #9
    کاربر دائمی آواتار ali_md110
    تاریخ عضویت
    فروردین 1385
    محل زندگی
    شیراز
    پست
    1,074
    تشکر کردن
    27
    749 بار تشکر شده در 532 پست

    نقل قول: طراحی ویومدل با جداول چند به چند

    میتونید بدینصورت عمل کنید


    var list= context.Products
    .Include(e => e.ProductMedias)
    .ThenInclude(e => e.Media)
    .ToList();

    foreach (var p in list)
    {
    Console.WriteLine({p.نام فیلد}");
    foreach (var t in p.ProductMedias.Select(e => e.Media))
    {
    Console.WriteLine(t.فیلد مدیا);
    }
    }

  14. کاربرانی که به خاطر مطلب مفید ali_md110 از وی تشکر کرده‌اند:


  15. #10
    کاربر دائمی
    تاریخ عضویت
    دی 1389
    پست
    531
    تشکر کردن
    581
    25 بار تشکر شده در 22 پست

    نقل قول: طراحی ویومدل با جداول چند به چند

    بسیار ممنون.من نمیتونم e.media رو در همون query به list بدم ؟ و باید از for استفاده کنم . در اینصورت برای یه همچین query هایی چطور میتونم از mapper استفاده کنم ؟ یا دیگه توی همون حلقه های for ویومدل رو new کنم و داده ها رو پاس بدم ؟

  16. #11
    کاربر دائمی آواتار ali_md110
    تاریخ عضویت
    فروردین 1385
    محل زندگی
    شیراز
    پست
    1,074
    تشکر کردن
    27
    749 بار تشکر شده در 532 پست

    نقل قول: طراحی ویومدل با جداول چند به چند

    لینک زیر یه توضیحاتی دادم ببینید شاید راهنمایی کرد
    مورد Automapper هم مد نظر داشته باشید
    http://barnamenevis.org/showthread.php?550025

  17. کاربرانی که به خاطر مطلب مفید ali_md110 از وی تشکر کرده‌اند:


تاپیک های مشابه

  1. سوال: نوشن کوری روی جداول با ارتباط چند به چند
    نوشته شده توسط alibahman47 در بخش ASP.NET MVC
    پاسخ: 8
    آخرین پست: جمعه 01 دی 1396, 20:34 عصر
  2. سوال: در طراحی database با visio رابطه چند به چند چطوری نشان داده می شود؟
    نوشته شده توسط yaldabarani در بخش تحلیل و طراحی نرم افزار
    پاسخ: 1
    آخرین پست: چهارشنبه 29 تیر 1390, 03:19 صبح
  3. سوال: تبدیل جداول طراحی شده با asp.net به excel
    نوشته شده توسط pbiuki630 در بخش ASP.NET
    پاسخ: 2
    آخرین پست: چهارشنبه 20 بهمن 1389, 15:55 عصر
  4. چگونه با imageen چند صفحه را به طور همزمان
    نوشته شده توسط prog_2005 در بخش کامپوننت های سایر شرکت ها، و توسعه کامپوننت
    پاسخ: 2
    آخرین پست: سه شنبه 21 مهر 1388, 06:41 صبح
  5. پاسخ: 1
    آخرین پست: یک شنبه 02 تیر 1387, 16:08 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •