EntityCollection <TEntity>.Contains (...) возвращает false для сущности, запрошенной из EntityCollection - PullRequest
0 голосов
/ 12 июня 2009

У меня есть следующий фрагмент кода.

// 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);

но найдено всегда ложно. Как это может быть?

edit: Мэтт, спасибо за ваше руководство, но позвольте мне сделать его немного более понятным, поскольку я не предоставил полный исходный код.

В моей базе данных три таблицы:

Project, Contact и ProjectContact, и между таблицей Project и Contact существует множество взаимосвязей через таблицу ProjectContact, хотя в таблице ProjectContact есть несколько дополнительных столбцов, помимо ключей таблицы Project и Contact, и поэтому я получаю дополнительную сущность называется ProjectContact, если я использую код, сгенерированный конструктором сущностей ADO.NET.

Теперь в какой-то момент я получаю экземпляр Project в своем коде, используя запрос linq to entity, т. Е.

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

Обратите внимание, что ContactSet является навигационным свойством таблицы Project to ProjectContact, а Contact является навигационным свойством таблицы ProjectContact to Contact.

Кроме того, у запрашиваемого Проекта, о котором идет речь, то есть «элемент», уже есть несколько ProjectContacts в его коллекции сущностей item.ContactSet, а ContactSet является стандартной реализацией EntityCollection, созданной конструктором сущностей.

С другой стороны, ProjectContact переопределяет Equals () и GetHashCode () и т. Д., Но если я использую эту переопределенную реализацию в EqualityComparer, тогда Project.ContactSet.Contains возвращает значение true, так что, полагаю, с этим проблем нет сложная часть приходит вместе. Предположим, у меня есть следующий фрагмент:

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.



}

Так как все происходит в одном и том же ObjectContext, я думаю, что я что-то упускаю в EntityCollection.Remove (). Но кажется странным, что ContactSet.Contains () возвращает false для элемента, полученного с помощью прямого запроса Where через ContactSet. В конце концов вопрос становится:

Как вы действительно удаляете элемент из коллекции EntityCollection без предварительного сохранения в базе данных. Поскольку вызов Remove () после Add (), по-видимому, завершается неудачей.

1 Ответ

0 голосов
/ 12 июня 2009

Похоже, это должно работать, Некоторые идеи:

ProjectContact переопределяет Object.Equals ()? Или, возможно, ContactSet реализует ICollection, и в реализации ICollection может быть ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...