天天看點

EF架構~充血模型設定不被持久化的屬性

回到目錄

在Poco實體中,一般隻有屬性沒有方法,這在軟體設計中稱為貧血模型,而在DDD領域驅動設計中,比較提倡充血模型,即你的Poco實體中,即有屬性,也有操作屬性的方法,注意這裡說的是操作屬性的方法,你的具體業務方法不要寫在這裡!

而在實際項目中,我們可以有這樣的需求,一個注冊使用者業務,它有密碼和确認密碼,這個确認密碼不需要存儲到資料表裡,即不需要被持久化,這時,我們想到的就是為它加NonSerialized特性,而在使用過程中我們發現,這個特性隻針對字段而言,而我們的實體中推薦使用屬性的方式,是以我們需要尋找其它解決方案。

而對于  System.ComponentModel.DataAnnotations.Schema命名空間來說,确實有一個更好的特性适合我們的需求,這個就是NotMapped特性,從它的注釋中可以看出,它主要功能就是從資料庫映射中移除它,即資料表中不展現這個屬性,現在我們代碼代碼修改一下,使用NotMapped實作的實體模型:

/// <summary>
    /// 使用者實體模式
    /// </summary>
    public class UserInfo : Entity
    {
        /// <summary>
        /// maxLength和stringLength都可以用來設定資料表字段的長度,stringLength不可以用來做MVC驗證
        /// </summary>
        [DisplayName("使用者名"), Required, StringLength(50, MinimumLength = 6, ErrorMessage = "使用者名隻能由6~50個字元組成")]
        public string UserName { get; set; }
        [DisplayName("真實姓名"), Required, StringLength(30, MinimumLength = 6, ErrorMessage = "真實姓名隻能由6~30個字元組成")]
        public string RealName { get; set; }
        public UserExtension UserExtension { get; set; }
        public List<OrderInfo> OrderInfo { get; set; }
        [DisplayName("密碼"), StringLength(20, MinimumLength = 8, ErrorMessage = "密碼由8~20個字元組成")]
        public string Password { get; set; }
        [DisplayName("确認密碼"), NotMapped]
        public virtual string TruePassword { get; set; }

        #region 充血模型的方法
        /// <summary>
        /// 生成MD5密碼
        /// </summary>
        /// <returns></returns>
        public string Md5Password()
        {
            return Lind.DDD.Commons.Encryptor.Utility.EncryptString(Password, Commons.Encryptor.Utility.EncryptorType.MD5);
        }
        /// <summary>
        /// 密碼和确認密碼的比較
        /// </summary>
        /// <returns></returns>
        public bool Password_TruePassword()
        {
            return this.Password.Equals(this.TruePassword, StringComparison.CurrentCulture);
        }
        #endregion

    }      

運作程式後,我們在資料表UserInfo中沒有找到TruePassword這個字段,這說明NotMapped已經幫我們實作了我們想要的功能!

通過上面的代碼,我們也看到了在DDD領域驅動裡充血模型的實作,需要注意的地方就是什麼樣的方法應該寫在模型裡,什麼樣的方法應該寫在業務層。

作者:倉儲大叔,張占嶺,

榮譽:微軟MVP

QQ:853066980

支付寶掃一掃,為大叔打賞!

EF架構~充血模型設定不被持久化的屬性