EF核心外键冲突,但是该键存在,并且在添加实体时将其填充

时间:2019-09-17 08:14:27

标签: c# asp.net-core entity-framework-core

我对实体框架核心有疑问。

问题是,我正在尝试添加预订。预订有一个订单列表,而订单具有供应商的外键。当我插入时,即使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正确且确实存在。

非常感谢您

0 个答案:

没有答案