0

IIS 7 でのオブジェクトの比較では理解できない、非常に奇妙な問題があります。古い IIS 6 ベースの ASP.NET アプリケーションを IIS 7 に展開しようとしていますが、等価比較の問題が発生しています。分からないようです。

まず、IIS 6 と IIS 7 の両方で同じアセンブリとコードを実行していますが、オブジェクトの比較は、IIS 6 と IIS 7 の両方で同じコードとは異なります。オブジェクトは次のようになります。

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();
    }
}

IIS 6 と IIS 7 の両方の ASPX ページに次のコードがあります。

<% 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)) %>
<% } %>

ここに私の結果があります:

IIS6:

100 <-- CountryID
100 <-- CountryID Hash Code
100 <-- Country Hash Code

1 <-- Something Found
1 <-- Something Found
1 <-- Something Found

IIS 7:

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 つのコレクションは、NHibernate を使用してロードされます。しかし、IIS 6 と IIS 7 の両方がアプリケーションのまったく同じビルドを使用していることを繰り返し述べなければならないと感じています。 Google で何かを検索しても、どうすればよいかわかりません。

これは、2 つのエンティティ オブジェクトを比較するときのシステム全体の問題でもあります。したがって、DynamicProxy2 ラッパーと関係がある可能性がありますが、両方のオブジェクトは Country オブジェクトであり、作成したオーバーライドを考えると、IIS 6 と IIS 7 ですべてが同じように機能するはずです。

更新 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た。これを解決するために私がしたことについては、以下の私の回答を参照してください。truetruetruefalse

更新 3:

これも何か関係があるのか​​もしれません: IIS7 でウィンザー城に http モジュールを登録するのを忘れたようです

4

4 に答える 4

1

あなたは何proposalCountriesを説明していませんproposalCountryServices。あなたの Equals メソッドは問題なく動作しているように見えますが、IIS7 ではそれらには別個のオブジェクトが含まれています。同じ ID を持つ 2 つのオブジェクトがあります (Equals が一致するため) が、それらは別個のオブジェクトであるため、== は一致しません。 .

2 つのコレクションがどのようにロードされるかについて詳細を教えてください - それが原因である可能性があります。

于 2009-03-04T17:39:38.007 に答える
0

参照の同等性を使用していません(以下を参照)。

Object.Equalsは、型でオーバーライドされたEqualsメソッドを呼び出します。

エンティティのさまざまなインスタンスをさまざまなDataContextから引き出してリストに追加したため、オーバーライドされたEqualsを使用して機能させようとしていると思われます。

アップデート:

申し訳ありませんが、LINQ2SQLを使用しているかどうかはわかりません。

== /!=演算子をオーバーライドすることで問題を修正できる可能性がありますが、それについても考慮すべき点がいくつかあります。

アップデート2:

私が何を意味するのかを理解するために、あなたが等しいとみなす両方のインスタンスを見つけてください(正確にこの問題が発生する場所)。ブレークポイントを設定します。ここで、&obj1に移動してEnterキーを押し、&obj2に移動してEnterキーを押すと、それらが異なるオブジェクトアドレスを指していることがわかります。IIS6と7の両方でこれを実行します。

IIS6とIIS7で動作が異なる理由はわかりませんが、ページのライフサイクルの微妙な違いが、参照が等しくない原因である可能性があります。

アップデート3:

IIS7でクラシックモードで実行していますか?そうでない場合は、そうしてみてください。

于 2009-03-04T17:17:47.683 に答える
0

これは私のために働いた解決策です:

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);
}

どうやら NHibernate または DynamicProxy は、Windows 2003 である種の魔法を行って、演算子が過負荷になることなく「==」演算子を機能させていたようです。

于 2009-03-04T18:47:06.550 に答える