N:N Entity Framework C# Relationship

Viewed 48

I'm having a problem with many-to-many relationships in a pizzeria system I'm developing.

I have an entity called "Payament" that has a list of Pizzas and a list of Drinks.

ex:

public class Payament
{
    
    public string? PayamentId { get; set; }

    public virtual List<Pizza> Pizzas { get; set; }

    public virtual List<Drink> Drinks { get; set; }

    public string? CPFId { get; set; }

    [JsonIgnore]
    public virtual Client? Client { get; set; }

    public double? TotalPay { get; set; }

    public DateTime DateTransaction { get; set; }

    public virtual StatusOrder StatusOrder { get; set; }

    public Payament()
    {
        Pizzas = new List<Pizza>();
        Drinks = new List<Drink>();
        DateTransaction = DateTime.Now;
        StatusOrder = StatusOrder.CARRINHO;
    }

    
}

Also, I have two entities Pizza and Drink.

ex:

public class Pizza : IItem
{

    public int Id { get; set; }

    public string Name { get; set; }

    public string Description { get; set; }

    public int Quantity { get; set; }

    public double Value { get; set; }

    [JsonIgnore]
    public virtual List<Payament> Payament { get; set; }

    public Pizza()
    {
        Payament = new List<Payament>();
    }

}


 public class Drink : IItem
{

    public int Id { get; set; }

    public string Name { get; set; }

    public string Description { get; set; }

    public int Quantity { get; set; }

    public double Value { get; set; }

    [JsonIgnore]
    public virtual List<Payament> Payament { get; set; }

    public Drink()
    {
        Payament = new List<Payament>();
    }
    
}

These classes are configured as many-to-many in OnModelCreating()... Drink:

builder.HasMany(h => h.Payament)
            .WithMany(d => d.Drinks);

Pizza:

builder.HasMany(h => h.Payament)
            .WithMany(p => p.Pizzas);

Payament:

builder.HasMany(p => p.Pizzas) 
            .WithMany(p => p.Payament);

        builder.HasMany(d => d.Drinks)
            .WithMany(d => d.Payament);

Migrations were generated, all right. But when I go to send a payment, I get this error:

MySqlException: Cannot add or update a child row: a foreign key constraint fails (pizzaroller.drinkpayament, CONSTRAINT FK_DrinkPayament_Payament_PayamentId FOREIGN KEY (PayamentId) REFERENCES payament (PayamentId) ON DELETE CASCADE)

What I believe it could be: If I'm not mistaken, a drinkpayament table and a pizzapayament table are created where the primary keys between the relations are joined.

And in this case, "Payament" has a primary key of type string, while items "Pizza" and "Drink" have a primary key of type int.

The conflict is likely to be found in this divergence. I could be wrong, of course. So I would like to know how I can solve this problem. And also, if possible, tips on how I can work with existing items for sale and relate them to a payment.

Project is on github if you want to take a look: https://github.com/newhobbye/pizza-roller-api

This project is for the exercise of knowledge and some patterns that I will implement to practice. I accept any kind of criticism! A big hug and many thanks!

1 Answers

I managed to solve.

I was resending the client entity in update. And I hadn't turned off the AsNoTracking() option;

In addition to this problem, I was also resending the items instead of associating the existing ones by id.

Thank you all for your help!

Related