Problème avec cascade supprimer en utilisant Entity Framework et System.Data.SQLite
J'ai une DB SQLite qui est configuré de sorte que lorsque je supprimer une Personne de la supprimer est en cascade. Cela fonctionne très bien lorsque je supprimer manuellement une Personne (tous les enregistrements qui font référence à la PersonID sont supprimés). Mais quand j'utilise Entity Framework pour supprimer la Personne que j'obtiens une erreur:
System.InvalidOperationException: The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.
Je ne comprends pas pourquoi cela se produit. Mon déclencheur est défini pour nettoyer tous les objets associés avant la suppression de l'objet qu'il a été dit à supprimer.
Quand je vais dans l'éditeur de modèle et de vérifier les propriétés de la relation, il ne montre aucune action pour le OnDelete de la propriété. Pourquoi n'est-ce pas réglé correctement en le tirant par la DB? Si je change cette valeur en Cascade tout fonctionne correctement, mais je préfère ne pas compter sur ce manuel de changer parce que si j'actualise mon modèle à partir de la DB et il perd.
Voici la relivent SQL pour mes tables.
CREATE TABLE [SomeTable]
(
[SomeTableID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
[PersonID] INTEGER NOT NULL REFERENCES [Person](PersonID) ON DELETE CASCADE
)
CREATE TABLE [Person]
(
[PersonID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT
)
source d'informationauteur jamone
Vous devez vous connecter pour publier un commentaire.
J'ai juste abordé ce problème précis. Il s'est avéré que lorsque j'ai utilisé EF
Update model from database...
option, elle n'avait pas bien obtenir la "Cascade" règle pour les supprimer.Essayez d'aller à votre EF modèle de base de données, cliquez sur le lien qui est à l'origine du problème, alors assurez-vous que le
End1 OnDelete
(peut-être End2, dépend de la base de données système) est définie surCascade
.J'ai eu le même problème avec SQL Server. Quand j'ai essayé de mode de mise à jour de la base de données, il n'a pas pris la cascade de règles. Notez que les règles ont été ajoutées après que le modèle a déjà été créé. J'ai même essayé de la suppression d'une table à partir du modèle et de l'ajouter à nouveau. Qui a eu le même effet - pas de cascade de règles.
Cependant, lorsque j'ai créé une marque nouveau modèle avec le même exacte des tables, il a ramassé la cascade de règles. Donc ma solution était tout simplement de supprimer l'ancien modèle et en créer un nouveau avec le même nom, etc.
Je suppose qu'il ya quelque chose de mal avec la mise à jour du modèle de processus de base de données.
Sonne comme un fournisseur de bug pour moi. La cascade doivent être ramassés à partir de la DB. Essayez avec SQL Server; vous verrez qu'il y travaille. Vous devez le signaler à celui qui a écrit votre SQLite fournisseur.
Vous pouvez utiliser la propriété de navigation seul, sans l'aide de la clé étrangère de la propriété. La suppression de la cascade ne résout pas le problème dans le code parce que votre objet ne sera pas marqué comme supprimé.