4

当我试图在数据库中插入一条记录,我得到这个错误信息:EF代码优先的INSERT语句冲突与外键约束

INSERT语句冲突与外键约束 “FK_dbo .Order_dbo.AspNetUsers_UserId”。冲突发生在 数据库“Test”,表“dbo.AspNetUsers”,列'Id'。 声明已被终止。

声明:我知道这个问题以前(hereherehere)被问过,但没有答案的帮我解决这个错误,我得到。

这里是模型:即插入新Order

[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; } 
} 

代码:

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,有一个值。

那么,为什么我得到这个错误信息?

+0

我总是先做数据库,但是在我看来,它无法在ApplicationUsers中找到满足新订单中用户ID的任何内容。最初建议用户不在ApplicationUsers表中,但在查看该表的实体时,我没有看到UserID甚至存在于哪里。? –

+0

'IdentityUser'代替'MembershipProvider'和'SimpleMembershipProvider'默认包含UserId,还有一些字段。 'asp.net-identity'标签添加到帖子中。 – Quoter

回答

6

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

该例外意味着AspNetUsers表中不存在这样的记录。

+0

这就是问题所在,我昨天就知道了。 UserId是数据库中的'varchar'('GUID'格式)。发生了什么事是,我删除了数据库并重新创建了它,但在IE中,当我仍然拥有以前的数据库时,我选中了“记住我”框。所以当我再次启动应用程序时,我已登录。它记住了我的旧用户信息。这就是为什么我有这个错误。无需检查数据库中是否存在'UserId'。 – Quoter

+1

一直盯着这半个小时......谢谢! – Aries51

相关问题