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
User contributions licensed under CC BY-SA 3.0