返回總目錄《一步一步使用ABP框架搭建正式項目系列教程》
上一篇博客,我們使用ABP模板創建了一個解決方案。現在,打開該解決方案,目錄圖如下:
下面直奔今天的主題——《創建實體類》。
一點小插曲:接觸ABP框架之前,一直都是使用的EF的DBFirst,在那種模式下,我們只要設計好數據庫,然后直接通過模板就生成了實體層,甚至都沒怎么留意實體層的代碼是什么樣子。現在要使用CodeFirst,就要反過來,先要寫代碼了,真有點不適應。好吧,為了學好ABP,也要硬着頭皮看看這其中的代碼到底啥模樣,但我這里不一定一行一行地敲哦,畢竟我這個系統就20多個實體左右,說不定以后還會增加,一個一個敲太費時間了。格外注意哦:在操作代碼之前,先打開Nuget工具,還原所有沒有加載成功的程序集。
理論學習:
ABP框架提供了一個定義了Id屬性的Entity類。我們可以通過繼承此類來讓自己的實體類擁有這個屬性,注意一點的是,這個Id是Int 32類型的。如果你的類的Id類型不是該類型,不要緊,ABP框架還提供了這個類的泛型Entity<T>,這里的T可以是任何你想要的類型。
動手實踐:
我這里有很多之前已經設計好的表,然后我直接通過動軟代碼生成器從數據庫中生成這些實體類。至於使用動軟代碼生成器的詳細步驟,不是這里討論的重點,有興趣的園友可以自己動手找一下這方面的資料。
在生成代碼之前,我必須定義一個實體類的模板Entity.cmt,我的模板代碼如下:
<#@ template language="c#" HostSpecific="True" #> <#@ output extension= ".cs" #> <# TableHost host = (TableHost)(Host); host.Fieldlist.Sort(CodeCommon.CompareByintOrder); #> using System; using Abp.Domain.Entities; namespace Noah.ChargeStation.Entities<# if( host.Folder.Length > 0) {#>.<#= host.Folder #><# } #> { <# if( host.TableDescription.Length > 0) {#> //<#= host.TableDescription #> <# } #> public class <#= host.GetModelClass(host.TableName) #>:Entity { <# foreach (ColumnInfo c in host.Fieldlist) { if(c.ColumnName!="Id") { #>/// <summary> /// <#= string.IsNullOrEmpty(c.Description) ? c.ColumnName : c.Description #> /// </summary> public virtual <#= CodeCommon.DbTypeToCS(c.TypeName) #><# if(c.Nullable) { #><#if(CodeCommon.isValueType(CodeCommon.DbTypeToCS(c.TypeName ))){ #>?<# }#><# }#> <#= c.ColumnName #> { get; set; } <# }} #> public <#= host.GetModelClass(host.TableName) #>() { } } }
接下來就是操作動軟代碼生成器生成大量的實體類了。
生成之后,將代碼放到項目中的領域層,下圖就是我生成的代碼了。
說明:用模版生成的解決方案,其中的每個項目默認都只是以"公司名.項目名"為命名空間的前綴,比如,我這里實體類的默認命名空間是“Noah.ChargeStation.Entities”,但我更喜歡這種命名方式“Noah.ChargeStation.Core.Entities”。所以,自己要手動改一下項目的默認命名空間,以后添加的文件都會更正了,但之前已經創建的文件還要手動修改。
生成實體類的工作就完成了,下一篇我們創建DbContext。