2009-06-12 4 views
0

J'ai l'extrait de code suivant.EntityCollection <TEntity> .Contient (...) renvoie false pour une entité interrogée à partir de EntityCollection

// Here I get an entity out of an EntityCollection<TEntity> i.e ContactSet. Entity is obtained and not null. 
ProjectContact obj = ((Project)projectDataGrid.SelectedItem).ContactSet 
    .Where(projectContact => projectContact.ProjectId == item.ProjectId && 
      projectContact.ContactId == item.ContactId).First(); 

// And the next line I just check whether ContactSet contains the queried entity that i.e. obj.  
bool found = ((Project)projectDataGrid.SelectedItem).ContactSet.Contains(obj); 

mais trouvé est toujours faux. Comment cela peut-il être?

edit: Merci Matt pour vos conseils mais laissez-moi le rendre un peu plus clair puisque je n'ai pas donné le code source complet.

J'ai trois tables dans ma base de données:

projet, veuillez communiquer et ProjectContact et il y a beaucoup à plusieurs entre projet et une table Contactez à travers la table ProjectContact, bien que le tableau ProjectContact a des colonnes supplémentaires autres que Les clés de projet et de contact, et c'est pourquoi j'obtiens une entité supplémentaire appelée ProjectContact si j'utilise le code généré par le concepteur d'entité de la structure d'entité ADO.NET.

Maintenant, à un moment donné je reçois un exemple de projet dans mon code en utilisant une LINQ aux entités requête à savoir:

var item = (from project in myObjectContext.Project.Include("ContactSet.Contact") 
      orderby project.Name select project).FirstOrDefault(); 

Notez que ContactSet est la propriété de navigation du projet à la table ProjectContact et Contact est la propriété de navigation de ProjectContact à la table Contact.

Par ailleurs, le projet en question interrogé à savoir « article » a déjà quelques ProjectContacts dans sa collection d'entités item.ContactSet et ContactSet est une implémentation standard EntityCollection généré par le concepteur de l'entité. D'autre part, ProjectContact substitue Equals() et GetHashCode() etc. mais si j'utilise cette implémentation redéfinie dans un EqualityComparer, alors Project.ContactSet.Contains retourne true, donc je suppose qu'il n'y a pas de problème avec ça mais maintenant la partie délicate arrive. Supposons que je l'extrait de code suivant:

using(SomeObjectContext myObjectContext = new SomeObjectContext()) 
{ 

var projectQueryable = from project in myObjectContext.Project.Include("ContactSet.Contact") orderby project.Name select project; 

ObservableCollection<Project> projects = new ObservableCollection<Project>(projectQueryable.ToList()); 

var contactQueryable = from contact in myObjectContext.Contact select contact; 

ObservableCollection<Contact> contacts = new ObservableCollection<Contact>(contactQueryable.ToList()); 

Project p = projects[0]; 

Contact c = contacts[0]; 

//Now if I execute the code below it fails. 

ProjectContact projectContact = new ProjectContact(); 

projectContact.Contact = c; 

projectContact.Project = p; 

projectContact.ContactId = c.Id; 

projectContact.ProjectId = p.Id; 

projectContact.Role = ContactRole.Administrator; // This corresponds to the column in ProjectContact table and I do manual conversion within the partial class since EF doesn't support enums yet. 

p.ContactSet.Add(projectContact); // This line might be unnecessary but just to be on the safe side. 

// So now p.ContactSet does indeed contain the projectContact and projectContact's EntityState is Added as expected. But when I execute the line below without saving changes it fails. 


bool result = p.ContactSet.Remove(projectContact); // result == false and projectContact is still in the p.ContactSet EntityCollection. 

//Now if I execute the line below 

myObjectContext.Delete(projectContact); 

//Now projectContact's EntityState becomes Detached but it's still in p.ContactSet. 

// Also note that if I test 

bool exists = p.ContactSet.Contains(projectContact); 

// It also returns false even if I query the item with p.ProjectContact.Where(...) it returns false. 



} 

Comme tout se passe dans le même ObjectContext je pense que je manque quelque chose au sujet EntityCollection.Remove(). Mais il semble encore étrange que ContactSet.Contains() retourne false pour un item obtenu via une requête directe Where sur ContactSet. A la fin, la question devient:

Comment supprimer réellement un élément d'un EntityCollection sans d'abord persister dans la base de données. Depuis un appel Remove() après Add() semble échouer.

Répondre

0

Cela ressemble à ça devrait fonctionner, quelques idées:

Does ProjectContact override Object.equals()? Ou peut-être le ContactSet implémente ICollection, et il peut y avoir un bug dans l'implémentation de ICollection.Contains()?

Questions connexes