Cuando trato de insertar un registro en la base de datos, me sale este mensaje de error:

La instrucción INSERT en conflicto con la restricción de CLAVE externa
«FK_dbo.Order_dbo.AspNetUsers_UserId». El conflicto se produjo en
la base de datos «Prueba», tabla «dbo.AspNetUsers», la columna ‘Id’. El
la declaración ha sido terminado.

Descargo de responsabilidad: yo sé que esta pregunta se ha hecho antes (aquí, aquí y aquí), pero ninguna de las respuestas me ayudaron a corregir este error.

Aquí los modelos:

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

Código que inserta el nuevo 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;
}

El error es introducida en esta línea: _dbContext.SaveChanges(); //this is where the error msg is being thrown.

Cuando la depuración puedo ver que UserId = userId, tiene un valor.

Así que ¿por qué estoy recibiendo este mensaje de error?

Yo siempre lo he hecho DB de primera, pero a mí me parece que no puede encontrar nada en ApplicationUsers que satisface de usuario en el nuevo Orden. Que inicialmente se sugiere que el usuario no está en el ApplicationUsers tabla, pero mirando a su entidad para que la tabla no veo donde UserID incluso existe..?
IdentityUser que sustituye a la MembershipProvider y la SimpleMembershipProvider contiene el id de usuario por defecto, y algunos de los campos más. asp.net-identity etiqueta que se añade al post.

OriginalEl autor Quoter | 2014-02-19

1 Comentario

  1. 8

    La AspNetUsers tabla en la base de datos debe contener un registro cuya UserId columna tiene el valor que se establece con userId en el nuevo orden. Order.UserId es no sólo necesario, sino también una clave externa para la AspNetUsers tabla (véase la [ForeignKey("UserId")] atributo en Order). Así, no es suficiente que Order.UserId ha cualquier valor (!= null), debe tener un valor que corresponde a un registro en el AspNetUsers tabla.

    La excepción significa que dicho registro no está presente en el AspNetUsers tabla.

    Ese fue exactamente el problema, y lo he descubierto ayer. El UserId es un varchar en la base de datos (GUID formato). Lo que sucedió es que, es que he borrado la base de datos y se vuelve a crear, pero en IE he marcado la casilla de «recordarme» cuando yo todavía tenía la base de datos anterior. Así que cuando empecé de nuevo la aplicación, que estaba conectado. Y recordé a mi viejo usuario de la información. Es por eso que he tenido este error. No se molestan en comprobar si el UserId existió realmente en la base de datos.
    La había estado mirando esto por media hora… gracias!

    OriginalEl autor Slauma

Dejar respuesta

Please enter your comment!
Please enter your name here