對T4模板研究-針對SQL SERVER的EF代碼產生

來源:互聯網
上載者:User

我們在做小型的網站的時候,經常要花費不少的時間去寫實體類、資料訪問類、業務類。這些東西搞完了,才去搞UI和具體的業務,是有點背油啊,雖然目前有一些產生工具能產生,但是還要花費一些精力去修改適應項目,所以在這研究了下T4模板(http://www.cnblogs.com/heyuquan/archive/2012/07/26/2610959.html),並簡單粗糙的做了一個工具。

針對SQL、產生EF代碼,能完成組建:

實體類:Model、針對資料庫表的映射而已

資料訪問類:目前只是EF的方式

業務類:產生之後能完成基本的 新增、刪除、查詢功能

這些代碼大家都寫油膩了,話不多說,先看看代碼,從代碼裡看看思想,以下為工具的部分代碼:

1.實體類

using System;using System.Collections.Generic;using System.ComponentModel.DataAnnotations;namespace model{    [Table("AccountBook")]    public class AccountBook : BaseModelGuid    {        public int? AccountCode { get; set; }        public DateTime? CreateTime { get; set; }        public int? Creater { get; set; }        public string Remark { get; set; }        public bool? IsDelete { get; set; }    }}

 產生出來的實體類大概是這麼一個樣子,你會注意到實體類都會派生自BaseModelGuid類,實際上這裡是做了一個約束,約束你在設計資料庫的時候,資料庫表必須有個名稱叫ID的主鍵欄位,nvarchar(36),實際上是用於儲存GUID,為什麼這麼做,等到產生業務類的時候再解釋吧。來看看基類的代碼:

public class BaseModel<T>    {        [Key]        public T Id { get; set; }    }public class BaseModelGuid : BaseModel<string>    {        public BaseModelGuid()        {            Id = System.Guid.NewGuid().ToString();        }    }

 這裡的意思是每張表對應的實體類的主鍵都放在了基類,產生實體類的代碼也很簡單,看看模板:

<#@ template language="C#" #><#@ assembly name="System.Core.dll" #><#@ assembly name="System.ComponentModel.DataAnnotations.dll" #><#@ assembly name="F:\項目\EFPocoCSCreater\EFPocoCSCreater\EFPocoCSCreater.UseModel\bin\Debug\EFPocoCSCreater.UseModel.dll" #><#@ import namespace="System" #><#@ import namespace="System.ComponentModel.DataAnnotations" #><#@ import namespace="System.Collections.Generic" #><#@ import namespace="EFPocoCSCreater.UseModel" #><#@ parameter name="TempModel" type="EFPocoCSCreater.UseModel.CreaterModel" #>using System;using System.Collections.Generic;using System.ComponentModel.DataAnnotations;namespace model{[Table("<#= TempModel==null?"":TempModel.TableName #>")]public class <#= TempModel==null?"A":TempModel.TableName #> : BaseModelGuid{<# if(TempModel!=null && TempModel.Fields!=null){ foreach (var item in TempModel.Fields){ #>public <#= item.CsDataType #> <#= item.Name #> { get; set; }<# }} #>}}

 

2.資料訪問類

先看看產生出來的代碼:

public class BaseDataAccess : DbContext    {        public BaseDataAccess()            : base("DataBaseURL")        {            SetInitializer();        }        /// <summary>        /// 初始化EF的DbContext        /// </summary>        protected virtual void SetInitializer()        {            //Database.SetInitializer<DProjectFileInfo>(null);        }    }public class DataAccess : BaseDataAccess    {        protected override void SetInitializer()        {            Database.SetInitializer<DataAccess>(null);        }        public DbSet<AccountBook> AccountBook { get; set; }        public DbSet<AccountInCome> AccountInCome { get; set; }        public DbSet<AccountInfo> AccountInfo { get; set; }        public DbSet<AccountType> AccountType { get; set; }        public DbSet<AccountUseType> AccountUseType { get; set; }        public DbSet<TBUser> TBUser { get; set; }        public DbSet<V_AccountBook> V_AccountBook { get; set; }        public DbSet<V_AccountInfo> V_AccountInfo { get; set; }    }

  這一塊沒什麼好說的吧,這裡的EF我把表映射很偷懶的產生在一塊了,呵呵。產生的模板也很簡單:

<#@ template language="C#" #><#@ assembly name="System.Core.dll" #><#@ assembly name="System.Data.Entity.dll" #><#@ assembly name="F:\項目\EFPocoCSCreater\EFPocoCSCreater\EFPocoCSCreater.UseModel\bin\Debug\EFPocoCSCreater.UseModel.dll" #><#@ import namespace="System" #><#@ import namespace="System.Data.Entity" #><#@ import namespace="EFPocoCSCreater.UseModel" #><#@ parameter name="TempModel" type="EFPocoCSCreater.UseModel.CreaterDataAccess" #>using System;using System.Data.Entity;namespace dataaccess{public class DataAccess : BaseDataAccess    {protected override void SetInitializer()        {            Database.SetInitializer<DataAccess>(null);        }<# if(TempModel!=null && TempModel.TablesName!=null){ foreach (var item in TempModel.TablesName){ #>public DbSet<<#= item #>> <#= item #> { get; set; }<# }} #>}}

 3.業務類

業務類是針對每一個表對象產生的,但是初始代碼很少:

using System;using System.Collections.Generic;using System.Linq;namespace business{public class BAccountBook : BaseBusinessString<AccountBook>    {        public BAccountBook()            : base(new DataAccess())        {        }    }}

 初始產生能完成基本的 新增、刪除、查詢功能都放在了基類,基類用到了泛型,約束了衍生類別,所以在基類也整合了根據ID的刪除、尋找操作,下面貼出部分基類的代碼:

public class BaseBusinessString<T> : BaseBusiness<T, string> where T : BaseModel<string>    {        public BaseBusinessString(DbContext context)            : base(context)        {        }        /// <summary>        /// 通過主鍵查詢        /// </summary>        /// <param name="id">主鍵Id</param>        /// <returns></returns>        public T FindById(string id)        {            return FindByPredicate(p => p.Id == id);        }        /// <summary>        /// 根據Id刪除        /// </summary>        /// <param name="id"></param>        protected virtual void PDeleteById(string id)        {            PDeleteByModel(FindById(id));        }        /// <summary>        /// 根據Id刪除        /// </summary>        /// <param name="id"></param>        public virtual bool DeleteById(string id)        {            PDeleteByModel(FindById(id));            return Context.SaveChanges() > 0;        }    }

 這樣一來,就產生好了能應付小型網站項目的實體類、資料訪問、基本業務類了,剩下的時間就直接針對具體的業務和UI了。

最後來說說這個工具,很粗糙、很簡單、很有針對性(基本上就是針對CsTemp目錄內的代碼產生的)的。

總共也只用到了T4模板,讀取資料庫,封裝了的些基類。

在程式目錄中:

CS Code:產生的程式碼目錄

CsTemp:產生出來的代碼所依賴的基類代碼

Dll:產生出來的代碼所依賴的DLL檔案

Temp:T4模板檔案目錄

 

接下來就是上傳的源碼了,代碼寫的很醜,謹慎觀看啊,同時也希望大家指出下缺陷

Code

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.