当我尝试在数据库中插入记录时,我收到以下错误消息:
插入语句与外键约束冲突 "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。