首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

LINQ to SQL 實體模型驗證最佳實踐:Changing/Changed 事件的正確使用

     編輯:關於.NET

在講解 MVC Token 時簡略提及 LINQ 實體的業務驗證,本文詳細闡述如何在 LINQ 生成的實體類中正確實現資料驗證與過濾。

LINQ 生成的實體 Setter 結構

[Column(Storage="_userMail", DbType="VarChar(100)")]
public string userMail {
    get { return this._userMail; }
    set {
        if (this._userMail != value) {
            this.OnuserMailChanging(value);  // 關鍵擴展點
            this.SendPropertyChanging();
            this._userMail = value;
            this.SendPropertyChanged("userMail");
            this.OnuserMailChanged();        // 關鍵擴展點
        }
    }
}

Setter 中先呼叫 OnuserMailChanging(value),這是我們植入業務邏輯判斷的最佳時機。

驗證邏輯:在 Changing 事件中攔截

partial void OnuserMailChanging(string value) {
    Regex reg = new Regex(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*");
    if (!reg.IsMatch(value)) {
        throw new ArgumentException("format error!");
    }
}

若格式錯誤直接拋出異常,賦值操作將被中止,實現前置驗證。

常見誤區:在 Changing 中修改值無效

若嘗試在 Changing 中過濾 HTML 字符:

partial void OnuserMailChanging(string value) {
    _userMail = FilterContent(_userMail); // 錯誤示範
}

原因有二:

  1. 形參 value 修改不影響實參。
  2. Setter 流程中,Changing 事件後會再次將 value 賦給 _userMail,覆蓋先前修改。

修改 Designer 代碼移除後續賦值不可取,因 Designer 代碼會被重新生成覆蓋。

正確做法:Changing 驗證 + Changed 過濾

將過濾邏輯放入 OnuserMailChanged,此時賦值已完成,修改字段值有效:

partial void OnuserMailChanged() {
    _userMail = FilterContent(_userMail);
}

結合策略:

  • OnChanging:格式驗證、業務規則檢查,失敗拋異常阻止賦值。
  • OnChanged:內容過濾、格式化、衍生屬性計算等後置處理。

如此結合,實體才能兼具健壯性與整潔性!

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved