首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EntityCollection<TEntity>.Contains(.)返回从EntityCollection中查询的实体的false

EntityCollection<TEntity>.Contains(.)返回从EntityCollection中查询的实体的false
EN

Stack Overflow用户
提问于 2009-06-12 02:34:51
回答 1查看 950关注 0票数 0

我有下面的代码片段。

代码语言:javascript
复制
// 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);

但发现总是错误的。这怎么可能呢?

编辑:谢谢你的指导,但让我说得更清楚一点,因为我还没有给出完整的源代码。

我的数据库里有三张桌子:

项目、联系人和ProjectContact --通过ProjectContact表,项目和联系人表之间存在着多到多的关系,尽管ProjectContact表有一些额外的列,而不是Project和Contact表键,这就是为什么如果我使用ADO.NET实体框架的实体设计器生成的代码,就会得到一个名为ProjectContact的额外实体。

现在,在某些时候,我通过使用linq到实体查询获得代码中的Project实例,即:

代码语言:javascript
复制
var item = (from project in myObjectContext.Project.Include("ContactSet.Contact")
           orderby project.Name select project).FirstOrDefault();

注意,ContactSet是ProjectContact表的导航属性,Contact是ProjectContact到Contact表的导航属性。

此外,问题中的项目--即"item“--已经在其item.ContactSet实体集合中包含了一些item.ContactSet,而ContactSet是由实体设计器生成的标准EntityCollection实现。

另一方面,ProjectContact重写等于()和GetHashCode()等,但是如果我在EqualityComparer中使用覆盖实现,那么Project.ContactSet.Contains返回true,所以我猜这没有问题,但现在出现了棘手的部分。假设我有以下片段:

代码语言:javascript
复制
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的直接Where查询获得的项,ContactSet()返回false似乎仍然很奇怪。最后,问题是:

如何在不首先持久化数据库的情况下从EntityCollection中实际删除项。因为在Add()之后的调用显然失败了。

EN

回答 1

Stack Overflow用户

发布于 2009-06-12 02:53:21

这看起来很管用,有些想法:

ProjectContact是否覆盖Object.Equals()?或者ContactSet实现了ICollection,并且在ICollection.Contains()的实现中可能有一个bug?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/984749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档