2

データベース (Visual Studio 2010、asp.net 4.0、c#) から生成された EntityDataModel があります。エンティティ クラスに関連付けられた部分クラスを使用してビジネス ロジックを実行しようとしています (この場合は、電話番号フィールドをチェックしてスペースを削除します)。

私がそのようなものを使用する場合:

 partial void OnMobilePhoneNoChanged()  
    {  
        if (MobilePhoneNo != null)  
        {  
            MobilePhoneNo = ATG_COModel_Common.FormatPhoneNumber(MobilePhoneNo);  
        }  
    }  

その後、無限ループが発生し (FormatPhoneNumber メソッドが MobilePHoneNo を変更してイベントが再び発生するなど)、スタック オーバーフローが発生します。

代わりに OnMobilePhoneNoChanging を使用して MobilePHoneNo プロパティ (またはvalue値) を変更しようとすると、値が正しく保存されません。

私は何をすべきか ?

4

1 に答える 1

2

.Designer.csモデルのファイルを見てください。次のように表示されます。

    /// <summary>
    /// No Metadata Documentation available.
    /// </summary>
    [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
    [DataMemberAttribute()]
    public global::System.String MobilePhoneNo 
    {
        get
        {
            return _MobilePhoneNo;
        }
        set
        {
            OnMobilePhoneNoChanging(value);
            ReportPropertyChanging("MobilePhoneNo");
            _MobilePhoneNo = StructuralObject.SetValidValue(value, false);
            ReportPropertyChanged("MobilePhoneNo");
            OnMobilePhoneNoChanged();
        }
    }
    private global::System.String _MobilePhoneNo;
    partial void OnMobilePhoneNoChanging(global::System.String value);
    partial void OnMobilePhoneNoChanged();

既に知っているパーシャルメソッドChangingとメソッドに加えて、バッキング フィールドがあることに注意してください。あなたのコードはclassの部分的な部分にあるため、プライベートなメンバーを含むすべてのメンバーにアクセスできます。したがって、部分メソッドを実装して、直接変更できます。ChangedChanged_MobilePhoneNo

partial void OnMobilePhoneNoChanged()  
{  
    if (_MobilePhoneNo != null)  
    {  
        _MobilePhoneNo = ATG_COModel_Common.FormatPhoneNumber(_MobilePhoneNo);  
    }  
}  

これはあなたが望むものです。

于 2012-06-21T08:49:21.737 に答える