J'utilise une messagerie d'utilisateur à utilisateur.
Voici sa classe :
Cela génère 3 clés étrangères dans la table.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38public class MessagesModel { public long Id { get; set; } public ApplicationUser UserExp { get; set; } public ApplicationUser UserDest { get; set; } public Articles Article { get; set; } public string Message { get; set; } public messageStatus Status { get; set; } public DateTime Created_at { get; set; } public string Topic { get; set; } public bool NewMsg { get; set; } public bool NewMsg_Exp { get; set; } public bool NewMsg_Dest { get; set; } public int Offre { get; set; } public OfferStatus OffreStatus { get; set; } public enum messageStatus { Sent, Delivered } public enum OfferStatus { None, Sent, Accepted, Denied, Cancelled, Expired } public MessagesModel() { Status = messageStatus.Sent; OffreStatus = OfferStatus.None; } }
Extrait du fichier de migration (Code First) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21constraints: table => { table.PrimaryKey("PK_Messages", x => x.Id); table.ForeignKey( name: "FK_Messages_Articles_ArticleId", column: x => x.ArticleId, principalTable: "Articles", principalColumn: "Id", onDelete: ReferentialAction.Cascade); table.ForeignKey( name: "FK_Messages_AspNetUsers_User_DestId", column: x => x.User_DestId, principalTable: "AspNetUsers", principalColumn: "Id"); table.ForeignKey( name: "FK_Messages_AspNetUsers_User_ExpId", column: x => x.User_ExpId, principalTable: "AspNetUsers", principalColumn: "Id"); });
Quand je supprime un utilisateur j'obtiens cette erreur :
La suppression en cascade fonctionne sur tous les 'articles' que possède l'utilisateur. Cela fonctionne bien pour toutes les autres tables (Panier, Favoris, Articles) tant que l'utilisateur n'a pas de message dans la messagerie.SET NOCOUNT ON; DELETE FROM [AspNetUsers] WHERE [Id] = @p0 AND [ConcurrencyStamp] = @p1; SELECT @@ROWCOUNT;
Microsoft.EntityFrameworkCore.Update: Error: An exception occurred in
the database while saving changes for context type
'LeC_MVC_Auth_2024.Models.LeCContext'.
Microsoft.EntityFrameworkCore.DbUpdateException: An error occurred
while saving the entity changes. See the inner exception for details.
---> Microsoft.Data.SqlClient.SqlException (0x80131904): The DELETE statement conflicted with the REFERENCE constraint
"FK_Messages_AspNetUsers_UserDestId". The conflict occurred in
database "CrecDB", table "dbo.Messages", column 'UserDestId'.
Dans ce cas précis, je ne sais pas si cette erreur survient au moment de la suppression de l'article, sujet du message, ou à celui de la suppression de l'utilisateur lui-même.
J'ai lu beaucoup sur la suppression en cascade, mais je ne comprends pas toujours ce que j'ai lu, et si cela peut s'appliquer à mon problème.
J'ai lu des choses sur ".WillCascadeOnDelete(false);" mais cette option n'existe pas pour moi.
Extrait de mon 'OnModelCreating' (qui ne comporte quasiment rien) :
À ce point, je ne vois que deux solutions
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 #region --- M E S S A G E S --- modelBuilder.Entity<MessagesModel>().HasKey(d => d.Id); modelBuilder.Entity<MessagesModel>().Property(d => d.Offre).HasDefaultValue(0); #endregion
- Empêcher de créer des clés étrangères pour "UserExp" et "UserDest" (j'ai besoin que cela reste 'ApplicationUser')
- Faire en sorte que la suppression en cascade ne se produise pas pour ces deux clés étrangères
Merci pour votre aide.





Répondre avec citation




Partager