Ef core foreign key violation but the key exists and it is filled when the entity is added

0

I have a problem with Entity framework core.

The problem is, that i'm trying to add a Booking. The booking has a list of orders, and a order has a foreign key to a supplier. When i insert, i get a foreign key violation even though the id is filled.

public Booking()
    {
        Orders = new List<Order>();
    }

    // Internal ID 
    public Guid InternalId { get; set; }

    public int ExternalId { get; set; }
    public int TotalPallets { get; set; }
    public DateTime? BookingTime { get; set; }

    public int Port { get; set; }
    public DateTime? ActualArrival { get; set; }
    public DateTime? StartLoading { get; set; }
    public DateTime? EndLoading { get; set; }

    public string Email { get; set; } 




    // ************************************* Relations ******************************

    // Order
    public  List<Order> Orders { get; }
    public Guid IntervalId { get; set; }
    public Interval Interval { get; set; }
    public Guid TransporterId { get; set; }
    public Transporter Transporter { get; set; }

 public Guid OrderId { get; set; }


    public string Comment { get; set; }     
    public int TotalPallets { get; set; }
    public int BottomPallets { get; set; }
    public string ExternalId { get; set; }  

    public string CustomerNumber { get; set; }
    public string OrderNumber { get; set; }
    public int WareNumber { get; set; }
    public string InOut { get; set; }


    // ************************************* Relations ******************************



    public Guid SupplierId { get; set; }
    public Supplier Supplier { get; set; }
    public Guid BookingId { get; set; }
    public Booking Booking { get; set; }



     public Supplier()
    {
        Orders = new List<Order>();
    } 


    // Internal ID
    public Guid SupplierId { get; set; }


    public string Email { get; set; }
    public int Telephone { get; set; }
    public string Name { get; set; }

    public DateTime ArriveTime { get; set; }

    public DateTime DeliveryStart { get; set; }
    public DateTime DeliveryEnd { get; set; }


    // ************************************* Relations ******************************

    public List<Order> Orders { get; }

The classes have the following configurations

 public void Configure(EntityTypeBuilder<Booking> builder)
    {
        builder.HasKey(e => e.InternalId);

        builder.Property(e => e.InternalId).ValueGeneratedNever();

        builder.HasOne(e => e.Interval)
            .WithMany(e => e.Bookings)
            .HasForeignKey(e => e.IntervalId)
            .HasConstraintName("FK_Bookings_Interval")
            .OnDelete(DeleteBehavior.Cascade);

        builder.HasOne(e => e.Transporter)
            .WithMany(e => e.Bookings)
            .HasForeignKey(e => e.TransporterId)
            .HasConstraintName("FK_Bookings_Transporter")
            .OnDelete(DeleteBehavior.Cascade);


    }

 public void Configure(EntityTypeBuilder<Order> builder)
    {
        builder.HasKey(e => e.OrderId);

        builder.Property(e => e.OrderId).ValueGeneratedNever();


        builder.HasOne(e => e.Supplier)
            .WithMany(e => e.Orders)
            .HasForeignKey(e => e.SupplierId)
            .HasConstraintName("FK_Orders_Supplier")
            .OnDelete(DeleteBehavior.Cascade);

        builder.HasOne(e => e.Booking)
            .WithMany(e => e.Orders)
            .HasForeignKey(e => e.BookingId)
            .HasConstraintName("FK_Orders_Booking")
            .OnDelete(DeleteBehavior.Cascade);



    }

 public void Configure(EntityTypeBuilder<Supplier> builder)
    {
        builder.HasKey(e => e.SupplierId);

        builder.Property(e => e.SupplierId).ValueGeneratedNever();




    }

This is the code where i try to insert a Booking.

public async Task<Unit> Handle(CreateBookingCommand request, CancellationToken cancellationToken)
    {



        // Get current User
        var loggedIn = _context.HttpContext.User.Claims.FirstOrDefault(c => c.Type == "sub")?.Value;

        if (loggedIn == null)
        {
            loggedIn = request.Booking.TransporterId.ToString();
        }


        if (request.Booking.Transporter == null)
        {
            var transporter = await _logisticBookingApiDatabase.Transporters.FindAsync(Guid.Parse(loggedIn ));
            if (transporter == null)
            {
                // throw error 
            }

            request.Booking.Transporter = transporter;
            request.Booking.Email = transporter.Email;
            request.Booking.TransporterId = transporter.TransporterId;
        }


        var booking = await createBooking(request, loggedIn);

        var order = await createOrder(request);

        booking.Orders.Add(order);




        var utilbooking = await _logisticBookingApiDatabase.UtilBookings.FirstOrDefaultAsync();
        if (!utilbooking.Bookingid.Equals(400))
        {
            _logisticBookingApiDatabase.UtilBookings.Remove(utilbooking);
            _logisticBookingApiDatabase.UtilBookings.Add(new UtilBooking());
        }

        _logisticBookingApiDatabase.Bookings.Add(booking);

        await _logisticBookingApiDatabase.SaveChangesAsync(cancellationToken);



        return Unit.Value;
    }


    public async Task<Order> createOrder(CreateBookingCommand request)
    {


        var supp = await _logisticBookingApiDatabase.Suppliers.FindAsync(Guid.Parse("45831DCD-E9E5-4E51-B31D-843BC0D12D1F"));

        var order1 = new Order();

        foreach (var order in request.Booking.Orders)
        {


            order1.CustomerNumber = "Not";
            order1.Comment = order.Comment;
            order1.InOut = order.InOut;
            order1.OrderNumber = order.OrderNumber;
            order1.WareNumber = order.WareNumber;
            order1.ExternalId = order.ExternalId;
            order1.TotalPallets = order1.TotalPallets;
            order1.BottomPallets = order1.BottomPallets;
            order1.OrderId = Guid.NewGuid();
            order1.SupplierId = supp.SupplierId;


        }

        _logisticBookingApiDatabase.Suppliers.Update(supp);

        return order1;
    }


    public async Task<Booking> createBooking(CreateBookingCommand request , string loggedIn)
    {

        var book = new Booking();

        // Get the current chosen Schedule
        var inter = await _logisticBookingApiDatabase.Intervals.FindAsync(request.IntervalId);


        // Find the interval and put the booking on
        if (inter.Bookings.Count == 0) 
        {
            inter.Bookings.Add(request.Booking); 
            inter.RemainingPallets -= request.Booking.TotalPallets;
        } else if (inter.Bookings.Count > 2)
        {
            inter.Bookings.Add(request.Booking);
            inter.RemainingPallets -= request.Booking.TotalPallets;
            inter.IsBooked = true;
        }





        book.InternalId = Guid.NewGuid();
        book.Email = request.Booking.Email;
        book.EndLoading = DateTime.Now;
        book.StartLoading = DateTime.Now;
        book.TotalPallets = request.Booking.TotalPallets;
        book.ActualArrival = DateTime.Now;
        book.Transporter = request.Booking.Transporter;
        book.Interval = inter;
        book.BookingTime = request.Booking.BookingTime;
        book.Port = request.Booking.Port;

        book.TransporterId = request.Booking.TransporterId;
        book.ExternalId = request.Booking.ExternalId;

        book.IntervalId = inter.IntervalId;

        return book;
    }
}

I get the following error

System.Data.SqlClient.SqlException (0x80131904): The INSERT statement conflicted with the 
 FOREIGN KEY constraint "FK_Orders_Supplier". The conflict occurred in database "backendDb", 
 table "dbo.Suppliers", column 'SupplierId'. The statement has been terminated.

I've been trying to figure out why the booking won't insert, because the Supplier id is correct and it does exists.

Thank you very much

c#
asp.net-core
entity-framework-core
asked on Stack Overflow Sep 17, 2019 by Casper Hansen

0 Answers

Nobody has answered this question yet.


User contributions licensed under CC BY-SA 3.0