【问题标题】:EF Code First The INSERT statement conflicted with the FOREIGN KEY constraintEF Code First INSERT 语句与 FOREIGN KEY 约束冲突
【发布时间】:2014-02-19 13:16:29
【问题描述】:

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

INSERT 语句与 FOREIGN KEY 约束冲突 “FK_dbo.Order_dbo.AspNetUsers_UserId”。冲突发生在 数据库“测试”,表“dbo.AspNetUsers”,列“Id”。这 语句已终止。

免责声明:我知道以前有人问过这个问题(hereherehere),但没有一个答案可以帮助我解决这个错误。

以下是模型:

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

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

【问题讨论】:

  • 我总是先做 DB,但在我看来,它在 ApplicationUsers 中找不到任何满足新订单中的 UserID 的东西。最初表明该用户不在 ApplicationUsers 表中,但是在查看该表的实体时,我看不到 UserID 甚至存在于哪里..?
  • IdentityUser 替换 MembershipProviderSimpleMembershipProvider 默认包含 UserId,以及更多字段。 asp.net-identity 标签添加到帖子中。

标签: c# ef-code-first runtime-error entity-framework-6 asp.net-identity


【解决方案1】:

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

异常意味着AspNetUsers表中不存在这样的记录。

【讨论】:

  • 这正是问题所在,我昨天发现了。 UserId 是数据库中的 varcharGUID 格式)。发生的事情是,我删除了数据库并重新创建了它,但是在 IE 中,当我仍然拥有以前的数据库时,我选中了“记住我”框。所以当我再次启动应用程序时,我已经登录了。它记住了我的旧用户信息。这就是为什么我有这个错误。懒得去检查UserId是否真的存在于数据库中。
  • 已经盯着这个看了半个小时...谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-28
相关资源
最近更新 更多