如何比较两个不同上下文中的两个对象

时间:2016-01-27 18:30:24

标签: c# entity-framework

我的应用程序上下文中有两个,两者在原理图和图中都相同。结构,一个在远程服务器上,另一个是安装在计算机上的本地服务器。假设两个数据库相同但数据不同,我尝试做的是从两个上下文中获取所有数据以进行比较,因此我可以在两个数据库中拥有相同的数据。 使用Distinct扩展方法不起作用。 我的类叫做Users,它们的属性是:ID,Name,Last Name,User,Password。 ID字段是Identity Not null。 现在我在两个数据库中只有一个相同的记录,因此,使用Distinct不应该返回数据,但我返回了它们。我用GetHashCode方法检查了哈希,这些是不同的。 这是我的代码:

    foreach (var item in remote.Users)
            lstUsers.Add(item);
    foreach (var item in local.Users)
            lstUsers.Add(item);

    var results = lstUsers.Distinct().ToList();

2 个答案:

答案 0 :(得分:0)

您可以创建自己的业务对象类来保存用户信息。您的lstUsers将是此业务对象的列表,而不是数据库/ EF类型的列表。在此业务对象中,您可以覆盖Equals和GetHashCode,以便在考虑2个用户对象是否相同时仅比较您关心的信息。

private Business.User Transform(User user)
{
    return new Business.User()
    {
        .Username = user.Username,
        .Name = user.Name
    }; //Etc; copy all fields you care about into your business object.
}

foreach (var item in remote.Users)
        lstUsers.Add(this.Transform(item));
foreach (var item in local.Users)
        lstUsers.Add(this.Transform(item));

var results = lstUsers.Distinct().ToList();

答案 1 :(得分:0)

您不能使用GetHashCode()的默认实现来判断两个对象是否具有相同的字段值。如果它们是不同的对象实例(它们是),GetHashCode()将为每个对象返回不同的值。

在任何情况下,由于每个数据库的ID都是Identity NOT NULL,因此对于相同的对象,ID可能不同。

根据您的具体需求,有一些选项可能会更好或更弱

  • 使用UNIQUEID(GUID)代替整数ID,并将其用于比较。
  • 将与ID分开的唯一标识符添加到每条记录中,并将其用于比较。
  • Implement IEquatable

我会对overriding GetHashCode() and Equals()持谨慎态度。