12

J'utilise EF 4 STE pour modéliser un objet Attachment. Le Pièce jointe contient un nom, une description, une date et, plus important, des données (byte[]). Pour optimiser le chargement, je ne souhaite pas récupérer la propriété Data avant qu'elle ne soit absolument nécessaire, c'est-à-dire lorsque l'utilisateur clique sur Download à partir du client. Dans le but de suivre cette approche, j'ai utilisé la technique de division de table décrite here. Je divise mon pièce jointe en pièce jointe (nom, description, date) et pièce jointeData (données). C'est une relation 1-à-1 dans mon modèle EF. Tout fonctionne très bien jusqu'à ce que j'essaie de supprimer un pièce jointe sans le AttachmentData (c'est-à-dire attachment.AttachmentData == null). Je reçois l'exception suivante:Entity Framework Split Table Supprimer

Données non valides rencontrées. Une relation requise est manquante. Examiner StateEntries pour déterminer la source de la violation de contrainte.

je vis un similar post, mais je ne peux pas sembler le faire fonctionner avec ECE et la méthode d'extension ApplyChanges.

À l'heure actuelle, mon code d'accès est simple: j'appelle le ApplyChanges() du contexte suivi du SaveChanges().

J'ai essayé une fonction SQL simple de suppression et l'ai mappée aux deux entités et cela a réellement fonctionné; Cependant, il a cassé l'insertion. Je n'arrive pas à mapper une fonction d'insertion pour toutes les propriétés aux deux entités.

Des idées sur d'autres options que je peux essayer? La relation entre Attachment et AttachmentData peut-elle être facultative? Quand je le fais de 1 à 0+, j'obtiens une erreur de mappage disant que Their primary keys may collide.

Ouvert à toutes vos suggestions.

Merci!

Répondre

6

La solution est similaire à la question liée mais vous devez utiliser la fonction spécifique des ONC - ApplyChanges:

context.Attachments.ApplyChanges(att); 
if (context.ObjectStateManager.GetObjectStateEntry(att).State == EntityState.Deleted) 
{ 
    var data = new AttachmentData() {Id = att.Id}; 
    context.AttachmentDataSet.Attach(data); 
    context.AttachmentDataSet.DeleteObject(data); 
} 
context.SaveChanges(); 
+0

Merci un bouquet pour la réponse! Fonctionne très bien! –

+0

C'est ce qui me déconcerte profondément: pourquoi ne peut-on pas comprendre qu'étant donné que les entités sont stockées dans la même table, la suppression de l'une efface l'autre? Pourquoi avez-vous besoin de le charger? –

+1

@FyodorSoikin: Je suppose que personne n'a encore implémenté cette fonctionnalité. –

Questions connexes