C# - EF核心一对多关系

发布于 2025-01-10 09:33:59 字数 3348 浏览 0 评论 0原文

我是新人,希望大家能帮我解决这个问题,谢谢大家的建议。 假设我有这 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 中的删除方法:

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 中的编辑方法

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();
            }

I'm new and I hope you can help me figure this out, thanks in advice to everyone.
Let's say I've got these 3 models

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; }
}

and I configured the relationships as following:

        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);

The problem that I've got is that when I delete Especialidad I can't edit/delete Medico cause it has no Especialidad and it's trying to Remove the relationship. And also it's not possible to delete Especialidad without having it assigned to a Medico because it's trying to delete the relationship and it's not found.

this is the Delete method in EspecialidadController:

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));
    }

this is the delete method in 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));
    }

this is the Edit method in MedicoController

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();
            }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

变身佩奇 2025-01-17 09:33:59

您必须在一个事务中从 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 的相同逻辑

You have to remove the record from m-m MedicoEspecialidad table and from main table in one transaction, so use SaveChanges only ones. And you will have to check if a MedicoEspecialidad table has a record before trying to remove from this table

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
    }

the same logic is for another table Medico

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文