C# 不同Linq到SQL上下文之间的实体相等性

C# 不同Linq到SQL上下文之间的实体相等性,c#,wpf,linq,entity-framework,linq-to-sql,C#,Wpf,Linq,Entity Framework,Linq To Sql,我正在尝试向我创建的WPF应用程序添加一些多线程,以便创建一个响应性更强的接口,但由于Linq到SQL数据上下文不是线程安全的,因此我不得不为每个线程使用一个多线程 我的问题是,从两个不同环境中提取的同一实体显然是不相等的。以下面的代码示例为例,其中我有一个包含员工记录的简单数据库: var context1=新的DataModelDataContext(); var context2=新的DataModelDataContext(); var emp1=context1.Employees.S

我正在尝试向我创建的WPF应用程序添加一些多线程,以便创建一个响应性更强的接口,但由于Linq到SQL数据上下文不是线程安全的,因此我不得不为每个线程使用一个多线程

我的问题是,从两个不同环境中提取的同一实体显然是不相等的。以下面的代码示例为例,其中我有一个包含员工记录的简单数据库:

var context1=新的DataModelDataContext();
var context2=新的DataModelDataContext();
var emp1=context1.Employees.Single(x=>x.ID==1);
var emp2=context2.Employees.Single(x=>x.ID==1);
WriteLine(string.Format(“Employees equal:{0}”,emp1==emp2));
Console.ReadKey();
运行时,将返回:

Employees equal:False
在我看来,我希望这些对象是相等的,就像我从相同的上下文中提取它们一样。我可以通过检查emp1.ID==emp2.ID来克服这一问题,但在尝试使用WPF绑定(如SelectedItem时,这是有问题的


这有什么办法吗?在实体框架中,这种行为似乎也是一样的。

两个独立实例化的对象可能代表数据存储中的同一项,但它们在任何语言中的计算结果都不相等。您必须编写代码来比较每个对象的成员,以确定它们的数据是否相等。这可能比比较主键更简单。

如@cdonner所述,当您从数据存储加载对象时,将使用相同的数据创建两个不同的对象实例。这意味着object1!=反对意见2

克服这一问题的一种方法是在存储库中设置一个类似缓存的字典。示例:
字典
。其中,
object
是标识符的类型(本例中为int)

因此,不要使用内联代码查询数据存储,比如
context1.Employees.Single(x=>x.ID==1)
您可以设置它,这样您可以像调用
Repositories.Employees.WithID(1)一样调用它

然后,这将检查本地存储库缓存中
Employee
对象的
ID==1
,如果可用,则返回该对象,而不是查询数据存储

从那时起,你的推荐信将永远不变


当您想从数据存储中更新和\或刷新内存中的对象时,这可能需要一些改进,以便您不会保留过时的数据,并且当您从数据存储中刷新数据时,您可以更新缓存。

您可以始终覆盖
Equals
GetHasCode
,以确保对象“相等”即使它们不是相同的实例(这是用于引用类型的默认相等规则)。

+1只想编写相同的实例。op自己刚刚给出了答案:
emp1.ID==emp2.ID
将完成任务(如果
ID
是唯一的主键或课程),覆盖equals似乎是一条路