C# 不同环境中的实体是否相互兼容?

C# 不同环境中的实体是否相互兼容?,c#,entity-framework,C#,Entity Framework,假设执行了以下代码: using (var e = new MyEntities()) CurrentUser = (from u in e.users where (...) select u).SingleOrDefault(); 当using块结束时,我只能访问用户字段,这没关系 现在,在其他一些代码中,在另一个线程中,我创建了另一个MyEntities实例,并执行另一个类似以下的查询: using (var e = new MyEntities()) temp = (from

假设执行了以下代码:

using (var e = new MyEntities())
  CurrentUser = (from u in e.users where (...) select u).SingleOrDefault();
using
块结束时,我只能访问用户字段,这没关系

现在,在其他一些代码中,在另一个线程中,我创建了另一个
MyEntities
实例,并执行另一个类似以下的查询:

using (var e = new MyEntities())
  temp = (from u in e.users where (...some other condition...).SingleOrDefault();
现在,进行以下比较是否正确?
temp==CurrentUser


我的意思是,我们知道这两个对象(
temp
CurrentUser
)可能引用同一条记录,但是实例呢?它们是相同的吗?

当前用户和临时用户都是引用,调用
temp==CurrentUser
只比较那些引用(而不是实际对象),因此它们永远不会为真。如果要比较实体,最好实现
IEquatable
并重写
obect.Equals()
object.GetHashcode()
。然后您可以调用
temp.Equals(CurrentUser)
,这将给出所需的行为。例如:

public class User : IEquatable<User>
{
   public int Id {get; set;}
   ...

   public bool Equals(User other)
   {
      return this.Id == other.Id;
   }

   public override bool Equals(object other)
   {
      return this.Id == (User)other.Id;
   }
   public override int GetHashcode()
   {
      return this.Id.GetHashCode();
   }
}
公共类用户:IEquatable
{
公共int Id{get;set;}
...
公共布尔等于(用户其他)
{
返回this.Id==other.Id;
}
公共覆盖布尔等于(对象其他)
{
返回此.Id==(用户)other.Id;
}
公共覆盖int GetHashcode()
{
返回此.Id.GetHashCode();
}
}

注意:您应该始终覆盖
对象
上的
Equals
GetHashcode
方法。例如,
HashSet
在内部使用这些方法,而不是由
IEquatable
实现的通用版本,因此如果不重写它们,您将得到错误的结果。

@Javid实际上,您只是在比较poco。您可以根据主键(简单或组合键)对它们进行比较。我们需要在另一个上下文中执行的linq中使用
CurrentUser
的次数如何?@Javid如果您在linq中对实体进行查询,您无论如何都不能将
CurrentUser
传递到查询中,您将始终比较Id或其他属性。您不需要实现IEquatable,只需从对象类重写==运算符。@CodeNotFound实现
IEquatable
允许您将
IEqualityComparer.Default()
与您自己的linq查询比较逻辑一起使用。此外,如果您实现了该接口,那么它只是向阅读您的代码的其他人表明您提供了自己的比较逻辑。