簡體   English   中英

C# - EF 核心一對多關系

[英]C# - EF core one-to-many relationship

我是新人,希望大家能幫我解決這個問題,謝謝大家的建議。 假設我有這 3 個模型

public class Especialidad
{
    public int IdEspecialidad { get; set; }
    public string Descripcion { get; set; }

    public List<MedicoEspecialidad> MedicoEspecialidad { get; set; }
}

public class Medico
{
    public int IdMedico { get; set; }

    public List<MedicoEspecialidad> MedicoEspecialidad { get; set; }
}

public class MedicoEspecialidad
{
    public int IdMedico { get; set; }
    public int IdEspecialidad { get; set; }

    public Medico Medico { get; set; }
    public Especialidad Especialidad { get; set; }
}

我將關系配置如下:

        modelBuilder.Entity<MedicoEspecialidad>().HasKey(x => new {x.IdMedico, x.IdEspecialidad});

        modelBuilder.Entity<MedicoEspecialidad>().HasOne(x => x.Medico)
        .WithMany(p => p.MedicoEspecialidad)
        .HasForeignKey(p => p.IdMedico);

        modelBuilder.Entity<MedicoEspecialidad>().HasOne(x => x.Especialidad)
        .WithMany(p => p.MedicoEspecialidad)
        .HasForeignKey(p => p.IdEspecialidad);

我遇到的問題是,當我刪除 Especialidad 時,我無法編輯/刪除 Medico,因為它沒有 Especialidad,並且它正在嘗試刪除關系。 而且,如果沒有將 Especialidad 分配給 Medico,也無法刪除它,因為它正在嘗試刪除關系,但找不到。

這是 EspecialidadController 中的 Delete 方法:

public async Task<IActionResult> Delete(int id)
    {
        var medicoEspecialidad = await _context.MedicoEspecialidad
        .FirstOrDefaultAsync(me => me.IdEspecialidad == id);

        _context.MedicoEspecialidad.Remove(medicoEspecialidad);
        await _context.SaveChangesAsync();

        var especialidad = await _context.Especialidad.FindAsync(id);

        _context.Especialidad.Remove(especialidad);
        await _context.SaveChangesAsync();

        return RedirectToAction(nameof(Index));
    }

這是 MedicoController 中的刪除方法:

public async Task<IActionResult> DeleteConfirmed(int id)
    {
        var medicoEspecialidad = await _context.MedicoEspecialidad
        .FirstOrDefaultAsync(me => me.IdMedico == id);

        _context.MedicoEspecialidad.Remove(medicoEspecialidad);
        await _context.SaveChangesAsync();

        var medico = await _context.Medico.FindAsync(id);

        _context.Medico.Remove(medico);
        await _context.SaveChangesAsync();

        return RedirectToAction(nameof(Index));
    }

這是 MedicoController 中的 Edit 方法

public async Task<IActionResult> Edit(int id, [Bind("IdMedico,Nombre,Apellido,Direccion,Telefono,Email,HorarioAtencionDesde,HorarioAtencionHasta")] Medico medico, int IdEspecialidad)
    {
        if (id != medico.IdMedico)
        {
            return NotFound();
        }

        if (ModelState.IsValid)
        {
            try
            {
                _context.Update(medico);
                await _context.SaveChangesAsync();

                var medicoEspecialidad = await _context.MedicoEspecialidad
                .FirstOrDefaultAsync(me => me.IdMedico == id);

                _context.Remove(medicoEspecialidad);
                await _context.SaveChangesAsync();


                medicoEspecialidad.IdEspecialidad = IdEspecialidad;

                _context.Add(medicoEspecialidad);
                await _context.SaveChangesAsync();
            }

您必須在一個事務中從 mm MedicoEspecialidad 表和主表中刪除記錄,因此僅使用 SaveChanges。 在嘗試從此表中刪除之前,您必須檢查 MedicoEspecialidad 表是否有記錄

public async Task<IActionResult> Delete(int id)
    {
        var medicoEspecialidad = await _context.MedicoEspecialidad
        .FirstOrDefaultAsync(me => me.IdEspecialidad == id);

        if ( medicoEspecialidad != null)
        _context.MedicoEspecialidad.Remove(medicoEspecialidad);
       
        var especialidad = await _context.Especialidad.FindAsync(id);
       var result=0;
       if (especialidad !=null)
       {
        _context.Especialidad.Remove(especialidad);
        result = await _context.SaveChangesAsync();
        }
        if (result > 0) return RedirectToAction(nameof(Index));
        return null; // or better to return an error message
    }

同樣的邏輯是另一個表 Medico

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM