我对实体框架核心有疑问。
问题是,我正在尝试添加预订。预订有一个订单列表,而订单具有供应商的外键。当我插入时,即使ID填满,我也会遇到外键冲突。
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; }
这些类具有以下配置
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();
}
这是我尝试插入预订的代码。
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;
}
}
我收到以下错误
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.
我一直在试图找出为什么不能插入预订的原因,因为供应商ID正确且确实存在。
非常感谢您