دسته بندی ها
08:32 1399/10/27

ایجاد ارتباط جداول پدر و فرزند (Parent-child) و نمایش در View در Asp.net Core

مشخصات سوال کننده :
کاربر : ms2soft     امتیاز کاربر : 0     رتبه کاربر : 7065
دسته بندی : Asp.net Core

به این سوال امتیاز بدهید    0
تعداد بازدید این سوال : 3730
هوش مصنوعی

پاسخ هوش مصنوعی

برای ایجاد ارتباط بین جداول «پدر و فرزند» در ASP.NET Core و نمایش اطلاعات آنها در View، شما نیاز به انجام چند مرحله دارید. در اینجا یک نمونه ساده به شما نشان داده می شود.

ابتدا مدل های مربوط به جدول های سند و آیتم های سند را ایجاد می کنیم:

public class Document
{
    public int Id { get; set; }
    public string Number { get; set; }
    public DateTime Date { get; set; }
    
    public virtual ICollection DocumentItems { get; set; }
}

public class DocumentItem
{
    public int Id { get; set; }
    public string Description { get; set; }
    public int DocumentId { get; set; }
    
    public virtual Document Document { get; set; }
}

اکنون باید DbContext را تنظیم کنیم:

public class ApplicationDbContext : DbContext
{
    public DbSet Documents { get; set; }
    public DbSet DocumentItems { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity()
            .HasMany(d => d.DocumentItems)
            .WithOne(di => di.Document)
            .HasForeignKey(di => di.DocumentId);
    }
}

در مرحله بعد، کنترلر را ایجاد می کنیم تا اطلاعات را از پایگاه داده دریافت کند و به View ارسال کند:

public class DocumentsController : Controller
{
    private readonly ApplicationDbContext _context;

    public DocumentsController(ApplicationDbContext context)
    {
        _context = context;
    }

    public async Task Index()
    {
        var documents = await _context.Documents
            .Include(d => d.DocumentItems)
            .ToListAsync();
        return View(documents);
    }
}

در نهایت، View را ایجاد می کنیم تا اطلاعات را نمایش دهد:

@model IEnumerable

Documents List

@foreach (var document in Model) { }
Number Date Items
@document.Number @document.Date.ToShortDateString()
    @foreach (var item in document.DocumentItems) {
  • @item.Description
  • }

با این روش، شما می توانید ارتباط بین جداول «پدر و فرزند» را ایجاد کرده و اطلاعات آنها را در View نمایش دهید.

به این پاسخ امتیاز بدهید    0
امتیاز: - رتبه: -
پاسخ دهنده : hamid_b 18:00 1399/10/27

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

فرض کنید دو جدول به صورت زیر دارید که رابطه Parent و Child با هم دارن.

 

جدول Invoice یا فاکتور (Parent)

public class Invoice
{
    [Key]
    public int ID {get; set;}
    public DateTime InvoiceDate {get; set;}
    public long InvoicePrice {get; set;}
    public int CustomerID {get; set;}
}

 

جدول InvoiceItem یا اقلام فاکتور (Child)

public class InvoiceItem
{
    [Key]
    public int ID {get; set;}
    public int ProductID {get; set;}
    public int ProductCount {get; set;}
    public int InvoiceID {get; set;}
    
    [ForignKey("InvoiceID")]
    public virtual Invoice Invoice {get; set;}
}

در کد بالا فیلد InvioceID به عنوان کلید خارجی در جدول InvoiceItem در نظر گرفته شده.

خب حالا می خوایم ببینیم چجوری میشه این دو جدول رو با هم ادغام کرد و اطلاعات رو نمایش داد. باید چند نکته رو دقت کرد. در این رابطه هر رکورد از جدول Parent یا همون جدول Invoice شامل چندین رکورد از جدول Child یا جدول InvoiceItem می شه. بنابراین ما نیاز به مدلی داریم که در اون هر رکورد از جدول Invoice شامل چندین رکورد از جدول InvoiceItem بشه. پس میتونیم مدل زیر رو ایجاد کنیم.

کافیه یک کلاس ایجاد کنید و اسمش رو مثلا InvoiceViewModel بذارید.

کدهای InvoiceViewModel

 

public class InvoiceViewModel
{
    public int ID {get; set;}
    public DateTime InvoiceDate {get; set;}
    public long InvoicePrice {get; set;}
    public int CustomerID {get; set;}

    public List<InvoiceItem> myItem {get; set;}
}

در ویومدل بالا فیلدهای جدول پدر یا همان Invoice را داریم و در آخر گفتیم هر رکورد شامل لیستی از InvoiceItem ها می باشد.

خب می تونیم برای نمایش اطلاعات به صورت Parent-Child از کوئری زیر استفاده کنیم.

 

var query = (from i in _db.Invoice
             select new InvoiceViewModel()
             {
                  ID = i.ID,
                  InvoiceDate = i.InvoiceDate,
                  InvoicePrice = i.InvoicePrice,
                  CustomerID = i.CustomerID,
                  myItem = _db.InvoiceItem.where(ii => ii.InvoiceID == i.InvoiceID).ToList()
              }).ToList();

کدهای بالا دقیقا خروجی که نیاز دارید رو بهتون میدن . یعنی یک رکورد از جدول پدر به همراه رکوردهای جدول فرزند.

به این پاسخ امتیاز بدهید    1
امتیاز: 518 رتبه: 4
1 نظر
ms2soft : سپاس از راهنمایی شما.. اما اگر خواسته باشیم اطلاعات را ثبت کنیم . اطلاعات پدر و آیتم های فرزند را ذخیره و ویرایش کنیم چگونه باید عمل کنیم به طوری که Id پدر در تمام آیتمهای فرزند هم درج شود؟

امتیاز کاربر : 0   رتبه کاربر : 7065   تاریخ ثبت : 09:23 1399/10/27
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود