EF Premier Code, L'instruction INSERT en conflit avec la contrainte de CLÉ ÉTRANGÈRE
Lorsque j'essaie d'insérer un enregistrement dans la base de données, j'obtiens ce message d'erreur:
L'instruction INSERT en conflit avec la contrainte de CLÉ ÉTRANGÈRE
"FK_dbo.Order_dbo.AspNetUsers_UserId". Le conflit s'est produit dans
base de données "Test", la table "dbo.AspNetUsers", la colonne "Id". L'
la déclaration a été résilié.
Avertissement: je sais que cette question a été posée avant (ici, ici et ici), mais aucune des réponses m'a aidé à réparer cette erreur que je reçois.
Voici les modèles:
[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; }
}
Code qui insère la nouvelle 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;
}
L'erreur est levée à cette ligne: _dbContext.SaveChanges(); //this is where the error msg is being thrown.
Lors du débogage, je peux voir que UserId = userId,
a une valeur.
Donc pourquoi j'obtiens ce message d'erreur?
IdentityUser
qui remplace le MembershipProvider
et la SimpleMembershipProvider
contient le nom d'utilisateur par défaut, et un peu plus de champs. asp.net-identity
ajouté le tag de la poste.OriginalL'auteur Quoter | 2014-02-19
Vous devez vous connecter pour publier un commentaire.
La
AspNetUsers
table dans la base de données doit contenir un enregistrement dont laUserId
colonne a la valeur que vous définissez avecuserId
dans le nouvel ordre.Order.UserId
est pas seulement nécessaire, mais aussi une clé étrangère à laAspNetUsers
table (voir le[ForeignKey("UserId")]
attribut dansOrder
). Donc, il ne suffit pas queOrder.UserId
a tout valeur (!= null), il doit avoir une valeur qui correspond à un enregistrement dans leAspNetUsers
table.L'exception signifie que ce dossier n'est pas présent dans la
AspNetUsers
table.UserId
est unvarchar
dans la base de données (GUID
format). Ce qui s'est passé, c'est que j'ai supprimé la base de données et recréée, mais sous IE, j'ai coché la case "se souvenir de moi" quand j'avais encore la base de données précédente. Lorsque j'ai commencé à nouveau l'application, j'ai été connecté. Et il se souvient de mes anciennes informations de l'utilisateur. C'est pourquoi j'ai eu cette erreur. N'a pas pris la peine de vérifier si leUserId
réellement existé dans la base de données.Avait été à regarder cela pendant une demi-heure... merci!
OriginalL'auteur Slauma