代码之家  ›  专栏  ›  技术社区  ›  Nick Berardi

为什么在IIS 7上比较对象实例时遇到奇怪的问题?

  •  0
  • Nick Berardi  · 技术社区  · 17 年前

    class Country : EntityBase {
        public int CountryID { get; set; }
        public string Name { get; set; }
    
        public override bool Equals(object obj) {
            if (obj == null || !(obj is Country))
                return false;
    
            Country c = (Country)obj;
            return CountryID == c.CountryID;
        }
    
        public override int GetHashCode() {
            return CountryID.GetHashCode();
        }
    }
    

    <% foreach(var country in proposalCountries) { %>
    <%= country.Country.CountryID %>
    <%= country.Country.CountryID.GetHashCode() %>
    <%= country.Country.GetHashCode() %>
    
    <%= proposalCountryServices.Count(c => c.Country == country.Country) %>
    <%= proposalCountryServices.Count(c => (c.Country != null && country.Country != null) && c.Country.Equals(country.Country)) %>)
    <%= proposalCountryServices.Count(c => Object.Equals(c.Country, country.Country)) %>
    <% } %>
    

    以下是我的结果:

    IIS 6:

    100 <-- CountryID
    100 <-- CountryID Hash Code
    100 <-- Country Hash Code
    
    1 <-- Something Found
    1 <-- Something Found
    1 <-- Something Found
    

    100 <-- CountryID
    100 <-- CountryID Hash Code
    100 <-- Country Hash Code
    
    0 <-- Nothing Found
    1 <-- Something Found
    1 <-- Something Found
    

    两者之间有区别吗。Windows 2003和Windows 2008上的.NET 3.5 SP1?我真的不知道问题是什么。有人经历过类似的问题吗?

    更新1:

    完全相同的构造

    更新2:

    这似乎是DynamicProxy2或NHibernate问题。因为我尝试了以下代码:

    <%
        var c1 = new ICost.Business.Entities.Country {
            CountryID = 100
        };
        var c2 = new ICost.Business.Entities.Country {
            CountryID = 100
        };
    %>
    <%= c1.CountryID == c2.CountryID %>
    <%= c1.GetHashCode() == c2.GetHashCode() %>
    <%= c1.Equals(c2) %>
    <%= Object.Equals(c1, c2) %>
    <%= c1 == c2 %>
    

    对于IIS 6和IIS 7,结果是, true , , false 。请参阅下面的答案,了解我为解决此问题所做的工作。

    这也可能与此有关: Looks like you forgot to register the http module with Windsor Castle with IIS7

    4 回复  |  直到 9 年前
        1
  •  1
  •   Jon Skeet    17 年前

    你还没解释什么 proposalCountries proposalCountryServices 是。在我看来,你的Equals方法工作得很好,但在IIS7中,它们包含不同的对象——你有两个ID相同的对象(所以Equals匹配),但它们是不同的对象,所以==不匹配。

    请详细说明这两个集合是如何加载的——这可能是原因所在。

        2
  •  0
  •   Gambrinus    17 年前

    我看到的区别是你写的

    c.Country == country.Country
    

    在第二种情况下,它是

    c.Country.Equals(country.Country))
    

    所以我猜在后一种情况下,他成功了,因为他在第一种情况下比较了两个对象的CountryID,但他是在比较对象本身。

        3
  •  0
  •   leppie    17 年前

    更新:

    抱歉,不确定您是否使用LINQ2SQL。

    更新2:

    为了理解我的意思,找到你认为相等的两个实例(确切地说,这个问题发生的地方)。设置断点。现在,去吧;obj1和enter以及&obj2和enter,您会注意到它们指向不同的对象地址。在IIS 6和7上执行此操作。

    我不确定为什么它在IIS6和IIS7上的行为不同,但我怀疑页面生命周期中的细微差异可能是它们在引用上不相等的原因。

        4
  •  0
  •   Nick Berardi    17 年前

    public static bool operator ==(BaseEntity a, BaseEntity b)
    {
        return Object.Equals(a, b);
    }
    
    public static bool operator !=(BaseEntity a, BaseEntity b)
    {
        return !Object.Equals(a, b);
    }
    

    推荐文章