EF架構(gou)~在T4模版中自定義屬性的getter和setter
T4模版為我們在ORM操作上提供了便捷,它很方便的可以對實體進行全局性的修改,之前我介紹過通過T4來為屬性加默認性,而今(jin)天我主要告訴大(da)家如何(he)使用(yong)T4模版將getter,setter塊改(gai)(gai)為(wei)自己(ji)需要的,何(he)為(wei)自己(ji)需要的?這當然是符合你(ni)(ni)當前項(xiang)目(mu)規(gui)則(ze)的,如,我希望監聽每個屬性的修(xiu)改(gai)(gai)過程,這正(zheng)如之前linq to sql的實體類一樣,它用(yong)來(lai)監聽你(ni)(ni)屬性的修(xiu)改(gai)(gai)前與(yu)修(xiu)改(gai)(gai)后,在兩個時(shi)機都(dou)可以分別訂(ding)閱你(ni)(ni)自己(ji)的事件,多(duo)么靈活,呵(he)呵(he)。
來看一下,我項(xiang)目中實(shi)體類最后的效(xiao)果圖(tu)
下面是T4模塊的(de)屬性獲取的(de)私有方法代碼,源于EF5中(zhong)的(de)T4模版
public string Property(EdmProperty edmProperty) { return string.Format( CultureInfo.InvariantCulture, "\r\n{6} {1} {5};\r\n{0} {1} {2} {{ {3}get {{ return {5}; }} {4}set {{ if ({5}!=value) {{ OnPropertyChanging(\"{2}\", {5}) ; {5}=value; OnPropertyChanged(\"{2}\", {5}); }}}} }} ", Accessibility.ForProperty(edmProperty), _typeMapper.GetTypeName(edmProperty.TypeUsage), _code.Escape(edmProperty), _code.SpaceAfter(Accessibility.ForGetter(edmProperty)), _code.SpaceAfter(Accessibility.ForSetter(edmProperty)), "_"+_code.Escape(edmProperty).ToLower(), "private" ); }
而最后生成它(ta)代碼如下
[Serializable] public partial class WebManageRole_WebManageMenus : Frameworks.Entity.Core.EntityBase { private int _webmanagemenus_menuid; public int WebManageMenus_MenuID { get { return _webmanagemenus_menuid; } set { if (_webmanagemenus_menuid != value) { OnPropertyChanging("WebManageMenus_MenuID", _webmanagemenus_menuid); _webmanagemenus_menuid = value; OnPropertyChanged("WebManageMenus_MenuID", _webmanagemenus_menuid); } } } private int _webmanageroles_manageroleid; public int WebManageRoles_ManageRoleID { get { return _webmanageroles_manageroleid; } set { if (_webmanageroles_manageroleid != value) { OnPropertyChanging("WebManageRoles_ManageRoleID", _webmanageroles_manageroleid); _webmanageroles_manageroleid = value; OnPropertyChanged("WebManageRoles_ManageRoleID", _webmanageroles_manageroleid); } } } }
事(shi)實上,代碼我們(men)并(bing)不(bu)是很滿意,因為它不(bu)夠漂亮,呵(he)呵(he),我們(men)更喜歡換(huan)行(xing)之后的代碼,當然(ran)你可以(yi)在T4里加一個\r\n這種(zhong)換(huan)行(xing)標記來實現(xian)。
經(jing)過我的測(ce)試(shi),還是將它換(huan)一下行吧(ba),呵呵,格式(shi)化一下看(kan)著(zhu)順眼點,代碼(ma)如下
public string Property(EdmProperty edmProperty) { string strReg=string.Empty; return string.Format(CultureInfo.InvariantCulture, @" {7}{6} {1} {5}; {7}{0} {1} {2} {{{3} {8}get {8}{{ {9}return {5}; {8}}}{4} {8}set {8}{{ {9}if ({5}!=value) {9}{{ {10}OnPropertyChanging(""{2}"", {5}) ; {10}{5}=value; {10}OnPropertyChanged(""{2}"", {5}); {9}}} {8}}} {7}}} ", Accessibility.ForProperty(edmProperty), _typeMapper.GetTypeName(edmProperty.TypeUsage), _code.Escape(edmProperty), _code.SpaceAfter(Accessibility.ForGetter(edmProperty)), _code.SpaceAfter(Accessibility.ForSetter(edmProperty)), "_"+_code.Escape(edmProperty).ToLower(), "private", strReg.PadRight(0), strReg.PadRight(4), strReg.PadRight(8), strReg.PadRight(12)); }
希望代(dai)碼可以給你(ni)帶來快樂!