c# - 来自不同上下文的实体是否相互兼容?

标签 c# entity-framework

假设执行了以下代码:

using (var e = new MyEntities())
  CurrentUser = (from u in e.users where (...) select u).SingleOrDefault();

using block 结束时,我只能访问用户字段,没关系。

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

using (var e = new MyEntities())
  temp = (from u in e.users where (...some other condition...).SingleOrDefault();

现在,做下面的比较对吗? temp==CurrentUser

我的意思是,我们知道这两个对象(tempCurrentUser)可能指的是同一条记录,但是实例呢?它们是一样的吗?

最佳答案

两者都是 CurrentUsertemp是引用,调用 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();
   }
}

注意:您应该始终覆盖 EqualsGetHashcode object 上的方法也。例如HashSet<T>在内部使用这些方法而不是 IEquatable<T> 实现的通用版本因此,如果您不覆盖它们,您将得到错误的结果。

关于c# - 来自不同上下文的实体是否相互兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35538642/

相关文章:

c# - 使用 C# 显示图像

c# - 为什么无法检查模型兼容性?

c# - 英特尔 MKL 错误 : Parameter 9 was incorrect on entry to cblas_zgemm (C# Linux)

c# - EntityDataSource 和 Entity Framework 6

c# - Linq 方法有问题

c# - 代码优先 : Mapping entities to existing database tables

c# - 以单一 mp4 格式复制 m3u8 段文件

c# - 报告查看器错误消息 "client found response content type of ' ' 但预期为 'text xml' 请求失败,响应为空。”

entity-framework - Entity Framework Remove 与 RemoveRange

c# - EF上下文和多线程