1. 程式人生 > >C#.Net實體程式碼生成工具(EntitysCodeGenerate)的使用及.NET中的ORM實現

C#.Net實體程式碼生成工具(EntitysCodeGenerate)的使用及.NET中的ORM實現

1 引言

目前大多數專案或產品都使用關係型資料庫實現業務資料的儲存,這樣在開發過程中,常常有一些業務邏輯需要直接用寫SQL語句實現,但這樣開發的結果是:遍地佈滿SQL語句。這些藕合較高的SQL語句給系統的改造和升級帶來很多無法預計的障礙。為了提高專案的靈活性,特別是快速開發,ORM是一個不錯的選擇。舉個簡單的例子:在使用ORM的系統中,當資料庫模型改變時,不再需要理會邏輯程式碼和SQL語句中涉及到該模型的所有改動,只需要將該模型對映的物件稍作改動,甚至不做改動就可以滿足要求。

ORM的全稱是Object Relational Mapping,即物件關係對映。它的實質就是將關係資料(庫)中的業務資料用物件的形式表示出來,並通過面向物件(

Object-Oriented)的方式將這些物件組織起來,實現系統業務邏輯的過程。在ORM過程中最重要的概念是對映(Mapping),通過這種對映可以使業務物件與資料庫分離。從面向物件來說,資料庫不應該和業務邏輯繫結到一起,ORM則起到這樣的分離作用,使資料庫層透明,開發人員真正的面向物件。下圖簡單說明了ORM在多層系統架構中的這個作用。

1 ORM在多層系統架構中的作用

當然ORM本身並不是全能的,當遇到特別複雜的資料處理及海量資料處理和彌補拙劣的設計不足時還得歸結到SQL或儲存過程來實現。所以快速開發、面向物件和效能優化靈活必須兼顧才行,這些該工具可以很好的做到,下文分別一一介紹。

2 內容

2.1 ORM的工具實現:C#.Net實體程式碼生成工具(EntitysCodeGenerate)

優秀的ORM工具不僅可以幫助我們很好的理解物件及物件的關係,而且工具本身會幫助我們維護這些關係,並且幫助我們記住欄位屬性業務含義及提供輔助的應用等。基於這個理念,我於多年的專案實踐和業餘時間設計開發了一個基於.NETORM工具——C#.Net實體程式碼生成工具(EntitysCodeGenerate),該工具運行於dotnetframework2.0框架下,希望多多交流並指正。

C#.Net實體程式碼生成工具(EntitysCodeGenerate)ORM提供物件持久、簡單物件查詢、事務處理等功能。資料持久包括一些物件的

InsertUpdateSaveDeleteSelect等功能,簡單物件查詢則提供一些基於物件的簡單物件查詢GetEntity等。該工具是基於VS.NET 2005的開發的應用程式,職責是從資料庫中提取生成實體類程式碼並幫助開發人員快速對映關係資料庫中的業務模型的對映實體類,暫時只提供從OracleSqlServerAccess資料庫生成C#程式碼的支援,可以生成實體及實體集的相關檔案,並自動提取資料庫表和欄位的註釋說明和對應的資料型別等。

另外所生成的程式碼檔案只需修改資料庫連線,即可用於目前市場上ado.net支援的各種型別的資料庫,如OracleAccessSqlServerMySQLExcel等。

ORM實現的前期工作中,為了實現遮蔽各種資料庫之間的操作差異,我們需要定義資料操作公有介面,封裝基本的資料庫增、刪、改、查等操作。下面以工具當前3.1版以資料庫Oracle的為例介紹。

3.1版實體層程式碼有個基類,基類裡其實也就是你專案的資料連線及型別的配置,該工具的實際應用時配置其實也就在這裡,預設為生成程式碼時所填寫的資料庫連線資訊,並可手工擴充套件修改:

public class BaseEntity

{

public static string GetConnectionString()

{

return "User ID=scott;Password=tiger;Data Source=85";//資料庫連線設定可修改從別處讀取

}

public static DatabaseType GetDatabaseType()

{

return DatabaseType.Oracle; //資料庫連線型別設定也可修改從別處讀取

}

……

}

這裡可設定該名稱空間當前實體下的資料庫連線型別及資料庫連線字串,當然也可以修改成從其它配置檔案中讀取。以前的版本是放在全域性設定DbConnectString這個類裡面,這樣的缺陷是當一個專案有多個數據庫時將不好處理,而現在通過使用基類及名稱空間則很容易解決。

此外,我們還需要定義下層各種資料庫操作的公共元件:

namespace System.Database

{
public class DbCore : IDisposable

{
……

public int ExecuteNonQuery(DBCommandWrapper command){}

public DataSet ExecuteDataSet(DBCommandWrapper command){}

……
}

}

再定義資料庫操作類及資料庫的基類和資料庫連線的工廠類,實現各種不同型別的資料。

public abstract class DBCommandWrapper {……}

internal abstract class Database{……}

internal sealed class DatabaseFactory{……}

……

然後實現各種資料庫的操作類,以Oracle為例

internal class OracleDatabase : Database{}

public class OracleCommandWrapper : DBCommandWrapper{}

最後在生成的實體類及基類檔案中生成相應的資料庫InsertUpdateDeleteGetEntitySave等操作和型別對映程式碼如下所示:

public int Insert()

{

ORMap<BaseEntity> ormap = new ORMap<BaseEntity>(this);

DEPT entity = new DEPT();

return ormap.Insert(entity);

}

……

public static System.Data.DbType GetDBTypeByFullName(string strTypeFullName)

{

switch (strTypeFullName)

{

case "System.Byte":

return System.Data.DbType.Byte;

case "System.Boolean":

return System.Data.DbType.Boolean;

case "System.Char":

return System.Data.DbType.Byte;

case "System.DateTime":

return System.Data.DbType.DateTime;

case "System.Decimal":

return System.Data.DbType.Decimal;

……

default:

return System.Data.DbType.Object;

}

}

在生成程式碼的同時,工具自動新增實體類的屬性標示及欄位註釋說明等如下所示:

[Serializable(),Description("Primary:DEPTNO")]

public class DEPT:BaseEntity

{

……

///<summary>

///主鍵

///</summary>

[DataObjectField(true)]

public int DEPTNO

{

set{ _deptno=value;}

get{return _deptno;}

}

///<summary>

///

///</summary>

[DataObjectField(false)]

public string DNAME

{

set{ _dname=value;}

get{return _dname;}

}

……

}

實體中的summary中的註釋自動將資料中表及欄位的註釋說明提取到這裡,方便程式設計師在程式碼編寫及維護中交流使用,理解其所對應的業務含義。示例是以Oracle資料庫自帶的示例庫為例介紹的,資料庫自帶的例項庫scott/tiger表註釋為空,所以這裡實體欄位提取出註釋也是為空。

實體定義完成後,我們需要根據實體類中繫結的屬性構造出執行期需要的SQL語句,收集實體類定義中的資料結構描述,再定義一個類來說明實體在執行期所引用到的所有關於資料持久的資訊,包括關鍵字欄位,一般欄位等。同時需要一個欄位的元資料欄位在資料庫中的名稱,大小,是否可為空,列型別等資訊。這些條件具備後,再定義解析類,負責轉換資料的程式型別到資料庫欄位型別,並且構造出InsertUpdate

相關推薦

C.Net實體程式碼生成工具(EntitysCodeGenerate)的使用.NETORM實現

1 引言 目前大多數專案或產品都使用關係型資料庫實現業務資料的儲存,這樣在開發過程中,常常有一些業務邏輯需要直接用寫SQL語句實現,但這樣開發的結果是:遍地佈滿SQL語句。這些藕合較高的SQL語句給系統的改造和升級帶來很多無法預計的障礙。為了提高專案的靈活性,特別是快速

.NET平臺開源專案速覽(4).NET文件生成工具ADB使用

    很久以前就使用ADB這個工具來生成專案的幫助文件。功能強大,在學習一些開源專案的過程中,官方沒有提供CHM幫助文件,所以為了快速的瞭解專案結構和註釋。就生成文件來自己看,非常好用。這也是一個學習方法吧。例如本文在:   上述2篇文章中最後的資源中就手動製作了CHM幫助文件。有時候我們還可

.net常用的程式碼生成工具

之前很多從事C#開發的用過動軟程式碼生成器,然後隨著IT技術的快速發展,湧現出很多優秀的工具關於.Net的,首推微軟的Entity Framework,其次是NHibernate。Entity Framework是微軟親兒子,和微軟自家的Sql Server整合得很好,支援功能強大的Linq。NHiberna

C#+SqlServer實體生成工具

我們在實際專案開發中,經常會用到實體類,編一個實體類生成工具,可以避免大家簡單重複地勞動、提高效率,非常有用。 實際效果圖如下: 相關係統表: 1、select * from sysobjects where xtype='U' and n

【乾貨分享】C# 實體生成工具

前言:   專案實戰中不論是業務編碼還是通用編碼,總會歸納出一些通用的工具類。放入專案中一勞永逸,讓兄弟姐妹們避免編寫重複程式碼。所以利用了工作之餘的時間,將這些散落在多個專案中精緻優雅的工具類,歸納起來形成工程,方便後續工作的使用和便捷開發。 根據實際需求,編寫了此工具。目前只支援SQLSer

mybatis程式碼生成工具 mybatis-generator

            mybatis-generator-1.0使用手冊 1.    編寫目的 1.1.前面的話 每個專案開始,都會寫到servi

使用程式碼生成工具Database2Sharp快速生成工作流模組控制器和檢視程式碼

在前面隨筆《基於Metronic的Bootstrap開發框架--工作流模組功能介紹》和《基於Metronic的Bootstrap開發框架--工作流模組功能介紹(2)》中介紹了Bootstrap開發框架的工作模組功能,前面文章也提及,通過程式碼生成工具直接生成對應的Create、ViewDetail、Index

Telosys:程式碼生成工具

在本文中,我們將檢查泰羅西斯,一個程式碼生成工具。我們會通過和作者談話來做到這一點,洛朗·蓋林。這將使我們有可能瞭解他對程式碼生成的看法,以及使用者通過使用Telosys實現了什麼。 為什麼程式碼生成工具相關?程式碼生成是模型驅動開發中最簡單和最常用的技術。我們使用一種資訊源,一種模型形式,並將其與一些模板

【Java工具推薦】Generator:Java程式碼生成工具

歡迎來到 Generator 寫這個程式碼生成器工具的想法源自2018年3月份,當時專案組剛完成一個Java Web專案的研發工作,在整個專案過程中耗費了不少的時間來構建SpringMVC的重複性程式碼和Mybatis的對映檔案,同時我也越來越覺得這些重複且難度不大的工作不

k8s,通過程式碼生成工具生成的controller加入控制邏輯

摘自http://www.infoq.com/cn/articles/kubernetes-status-management-and-extension 前文自動生成的程式碼中為Bee生成了預設的BeeController,如圖1.2.2所示。 當監聽到建立或更新Bee狀態的時候,可

mybatis-generator程式碼生成工具

1、pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http:/

Spring MVC 典型分層Java程式碼生成工具

本文目的: 企業應用開發實際過程中必不可少的步驟是對資料庫表進行增刪查改,相應的java程式碼基本實現都需要不停拼接資料庫欄位。為了減少程式設計師重複勞動,本文嘗試編寫工具類基於資料表字段生成基本的java的實體類模板,controller類模板,ser

java程式碼生成工具簡單羅列

Java中也有類似於codesmith的程式碼生成工具,不過開源的或免費的挺多,以下簡單介紹: 1.spring roo   spring官方專案之一。 2.m2Spring   貌似商業的。 3.springside    國產的,作者csdn江南白衣 4.rapid

dalgen程式碼生成工具

https://www.jianshu.com/p/e2b5d5a16bf0 1.    簡介         目前專案中的common-dal層程式碼還是主要靠人工去寫,這就引入一個問

Spring框架全自動程式碼生成工具

在專案的不同階段,都有相應的程式碼生成工具,而想實現全自動程式碼生成,則比較困難。 【架構師助手】就是針對這一需求,程式設計師只需輸入業務資料模型,【架構師助手】在10秒鐘內就可以為你生產出一個基本功能完備、可立即執行並看到實際效果的業務資訊化系統軟體(包括前端web頁面與後端業務程式碼)。

10 個超棒的 CSS3 程式碼生成工具

以下資源是完全免費的web應用,可用於生成圖案、漸變、甚至瀏覽器字首屬性的CSS3程式碼。如果你寫的是前端程式碼,然後這些資源可以為你節省大量的時間,併為今後的專案工作提供可重複片段。 1. CSS3 Generator 大家最喜愛的用於程式碼生成的web應用之一就是CSS3 Gener

程式碼生成工具lombok的簡單使用

1、為eclipse安裝lombok外掛            將lombok.jar 拷入F盤  (隨意位置並不一定非要F盤)            進入cmd命令視窗輸入f:切換到F盤       

程式碼生成工具generator

這裡僅僅貼配置程式碼,不說安裝 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE generatorConfiguration 3 PUBLIC "-//mybatis.org//DTD MyBatis

通用mybatis mapper程式碼生成工具

以下介紹的是針對通用tk mybatis 程式碼生成方法 1.依賴引入 <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId>

基於Metronic的Bootstrap開發框架經驗總結(18)-- 在程式碼生成工具Database2Sharp整合對Bootstrap-table外掛的分頁排序支援

在我們開發系統介面,包括Web和Winform的都一樣,主要的介面就是列表展示主介面,編輯檢視介面,以及一些輔助性的如匯入介面,選擇介面等,其中列表展示主介面是綜合性的資料展示介面,一般往往需要對記錄進行合理的分頁,整合各種增刪改查的按鈕等功能。隨著開發專案的需求變化,對資料記錄分頁展示、排序等功能都是常態的