2009-12-04 6 views
0

J'ai deux tables FilesystemEntries et CacheEntries où il y a une association de 0..1 CacheEntry par FilesystemEntry (c'est-à-dire que FilesystemEntry peut avoir une CacheEntry null, mais pas l'inverse) . Initialement, CacheEntry pour tous FilesystemEntries est null. J'ai du mal à changer cela (en ajoutant un nouveau CacheEntry). Le code (tronquée) ressemble à ceci:Entity Framework: Insérer une nouvelle entité associée à une autre entité

FilesystemEntry filesystemEntry; // Already exists in database 
CacheEntry cacheEntry;   // A new one is created 
// ... 
filesystemEntry.CacheEntry = cacheEntry;  // Was null before (verified in debugger) 
cacheEntry.FilesystemEntry = filesystemEntry; 
_db.AddToCacheEntries(cacheEntry); 

Cependant, je recieving l'erreur suivante:

System.Data.UpdateException: A relationship is being added or deleted from an 
AssociationSet 'FK_CacheEntries_0'. With cardinality constraints, a corresponding 
'CacheEntries' must also be added or deleted. 

Tous les assistants-cadres de l'entité savent ce qui se passe?

De même, existe-t-il un moyen de permettre à la base de données de gérer le "ON DELETE CASCADE" (j'utilise sqlite, donc ce sera via un trigger)? Ce serait beaucoup plus pratique et futur-proof que de spécifier toutes les suppressions dans le DAL.

Répondre

2

Vous ne savez pas si c'est le problème.

Mais je vais essayer de faire ceci:

FilesystemEntry filesystemEntry; // Already exists in database 
CacheEntry cacheEntry; // A new one is created   
filesystemEntry.CacheEntry = cacheEntry; 
// redundant cacheEntry.FilesystemEntry = filesystemEntry; 
// redundant _db.AddToCacheEntries(cacheEntry); 
_db.SaveChanges(); 

La première opération redondante pourrait être la cause du problème.

En ce qui concerne la cascade supprimer, jetez un oeil à ce Tip pour une explication de comment Cascade supprimer vraiment fonctionne dans EF.

Alex

+0

merci génial! –

0

je peux me tromper, mais à moins que je suis malentendu vos relations d'entité, vous pouvez essayer sans la ligne

cacheEntry.FilesystemEntry = filesystemEntry; 

. Cela devrait être implicite par le fait que vous définissez

filesystemEntry.CacheEntry = cacheEntry; 

Aussi j'ai eu une bonne chance en utilisant le type d'affectation, pour traiter les propriétés de navigation:

cacheEntry.FilesystemEntryReference.Value = filesystemEntry; 
Questions connexes