EF 代码优先 INSERT 语句与外键约束冲突



当我尝试在数据库中插入记录时,我收到以下错误消息:

插入语句与外键约束冲突 "FK_dbo。Order_dbo。AspNetUsers_UserId"。冲突发生在 数据库"测试",表"dbo。AspNetUsers",列"Id"。这 声明已终止。

免责声明:我知道这个问题之前已经被问过(这里,这里和这里),但没有一个答案帮助我修复我得到的这个错误。

以下是模型:

[Table("Order")]
public class Order
{
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity), Key]
    public int Id { get; set; }
    [Required]
    public string UserId { get; set; }      
    public virtual List<OrderDetails> OrderDetails { get; set; }
    [ForeignKey("UserId")]
    public virtual ApplicationUser User { get; set; }
}    
[Table("OrderDetails")]
public class OrderDetails
{
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity), Key]
    public int Id { get; set; }
    [Required]
    public int OrderId { get; set; }
    [ForeignKey("OrderId")]
    public virtual Order Order { get; set; }
}
public class ApplicationUser : IdentityUser
{
    [MaxLength(15)]
    public string FirstName { get; set; }
    [MaxLength(15)]
    public string LastName { get; set; }
    [MaxLength(50)]
    public string EmailAddress { get; set; }
    public virtual List<Order> Orders { get; set; }
}

插入新Order的代码:

public OrderDetails Add(dynamic addOrderDetails, string userId)
{
    if (addOrderDetails.OrderId == null)
    {
        var order = new Order()
        {
            UserId = userId,
            CreateDate = DateTime.Now,
            Status = OStatus.InProgress,
            Confirmed = (DateTime?)null,
        };
        var newOrder = _dbContext.Orders.Add(order);
        _dbContext.Entry(order).State = EntityState.Added;
        _dbContext.SaveChanges(); // this is where the error msg is being thrown.
        var orderDetails = new OrderDetails()
        {
            OrderId = newOrder.Id,
            ServiceId = addOrderDetails.ServiceId,
            EventStart = start,
            EventEnd = end
        };
        var newOrderDetails = _dbContext.OrderDetails.Add(orderDetails);
        _dbContext.Entry(orderDetails).State = EntityState.Added;
        _dbContext.SaveChanges();
    }
    return null;
}

错误被抛出到这一行:_dbContext.SaveChanges(); // this is where the error msg is being thrown.

调试时,我可以看到UserId = userId,有一个值。

那么为什么我会收到此错误消息?

数据库中的

AspNetUsers表必须包含一条记录,该记录的UserId列具有您使用新顺序userId设置的值。 Order.UserId不仅是必需的,而且是AspNetUsers表的外键(请参阅Order中的[ForeignKey("UserId")]属性)。因此,Order.UserId具有任何值 (!= null) 是不够的,它必须具有与 AspNetUsers 表中的记录对应的值。

异常意味着AspNetUsers表中不存在此类记录。

插入语句与外键约束冲突"FK_dbo。Order_dbo。AspNetUsers_UserId"。冲突发生在数据库"测试",表"dbo。AspNetUsers",列"Id"。声明已终止。

这意味着如果不引用 AspNetUsers的现有用户,就无法创建 Order_dbo 处的单个订单(行)。

此错误来自实际数据库,这就是为什么您在到达 _dbContext.SaveChanges() 时而不是之前收到它的原因。

可能的解决方案

使列AspNetUsers_UserId可为空。

[Required]
public int? UserId { get; set; } 

这样,您就可以创建订单,而无需先前设置的用户。

我建议你使用int而不是string类型为你 Id。

相关内容

  • 没有找到相关文章

最新更新