不要EntityFramework,不要NHibernate,打造自己的ORM(二)


我的ORM,暫時命名為LinFramwork吧,有如下特點:

一 不僅支持若干主流數據庫SQL Server,Oracle等,基於我前面隨筆里闡述的通用數據訪問組建原理,只要提供相關數據庫ADO.NET Provider,並實現SQL解析的接口,還可以支持新的數據庫類型。同時,對於調用者完全"透明",即開發人員只需定義數據庫連接字符串即可,無須象其他ORM那樣,還要在配置文件里加上數據庫類型的屬性。對於Oracle,我直接集成了Oracle的ODP.NET的相關dll,使其免客戶端安裝。簡而言之,假如把數據庫從SQL Server切換到Oracle,把連接信息改改即可。
客戶端配置文件

 <connectionStrings>
        <add name="MSSQL"  connectionString="Data Source=localhost\sqlexpress;
             Initial Catalog=Northwind;Integrated Security=True"/>
        <add name="Oracle" connectionString="Data Source=(DESCRIPTION =(ADDRESS_LIST=
             (ADDRESS=(PROTOCOL=TCP)(HOST=192.168.116.128)(PORT = 1521)))(CONNECT_DATA =
             (SID = xe)(SERVER = DEDICATED)));User ID=sa;password=sa" />      
    </connectionStrings>

  客戶端初始化實體對象上下文

            EntityContext sqlContext = new EntityContext(ConfigurationManager.ConnectionStrings["MSSQL"].ConnectionString);
            EntityContext oraleContext = new EntityContext(ConfigurationManager.ConnectionStrings["Oracle"].ConnectionString);


二 類似EF的Codefirst,只需簡單的定義一個實體。

 public class Categories
    {
        public int CategoryID { get; set; }
        public string CategoryName { get; set; }
        public string Description { get; set; }

    }

 注意看實體的定義與一般ORM的區別,我看過很多人自己開發的ORM,均覺得實體定義太羅嗦了,或者NH那樣搞一大堆xml定義實體,或者像EF那樣必須繼承一個實體基類,或者在實體的屬性上加上一堆特性定義,諸如對應的數據庫表名稱,字段名稱,是否主鍵,是否自增,字段類型等等(很多orm同時具備以上幾點),而我這里的設計,就這么簡單,可以什么特性都不加,也不用繼承什么實體基類,更不用再搞一堆xml。 

三 提供泛型的統一CRUD接口。
這里摘取幾個最常用的CURD方法作為示例

 EntityContext context = new EntityContext(ConfigurationManager.ConnectionStrings["Oracle"].ConnectionString);
            // 新增            
            context.Insert(new Product() { Categoryid = 1, CategoryName = "食品" });
            //查詢            
            Product product =  context.GetEntityByKey<Product>(8);
            //修改             
            product.CategoryName ="xxxxx";
            context.Update(product);
            //刪除          
            context.Delete(product);

  

四  新增記錄時可以返回自增主鍵(同時支持 SQL Server 和Oracle,oracle需要建序列)

五 更新記錄時可以只修改有改動的字段

         //修改            
        context.PreUpdate(product);
        product.CategoryName ="xxxxx";
            context.Update(product);

五 將查詢結果轉換為實體集合時使用Emit實現,達到最佳性能。

List<Product> products = context.Query<Product>("Categoryid=@Categoryid", 1);

六 只需定義簡單實體,無需xml定義,無需代碼生成,實體特性上無需加入元數據信息,達到使用最簡單化。

七 查詢條件參數化,簡單明了(參看五的代碼)。

八 事務支持

 try
            {
                context.BeginTransaction();
                context.Update(product);
                context.Delete(product);
                context.Commit();
            }
            catch (Exception ex)
            {
                context.Rollback();
            }

  

 九 支持擴展數據庫支持,只需實現我的解析sql的接口和提供可以執行該sql的data provider即可。

 簡單概括就是,配置一個數據庫連接,並用該連接實例化一個ObjectContext對象,定義一個與數據庫表對應的實體,實體定義無需添加任何特性,便可實現CRUD了,我自認為是最簡單易用的ORM,當然我這個orm還有很多人性化的地方,我並沒有細細道出,這里只是介紹個大概。各位網友還有什么更好的提議或者更多的想了解的細節,歡迎提出!

 

關於網友提到源碼和試用的問題,我這里作一個補充說明 暫時提供dll下載,不開放源碼,原因如下
1 框架目前來說完成不久,雖然主體功能都已經有了,但還需要實踐檢驗。
2 由於是我個人業余時間寫的,代碼寫的比較粗礦,日志跟蹤,異常處理之類是基本沒有的。。。
3 將來可能會在工作中使用。

當然也不排除一段時間,代碼成熟以后,朋友們感興趣的話,我發布源碼。
使用方式很簡單,下載dll,引用這兩個dll就可以了。如果是oracle,連接字符串參考我的寫法,另外需要拷貝
OraOps11w.dll,Oracle.DataAccess.dll,orannzsbb11.dll,oci.dll,ociw32.dll,oraocci11.dll,oraociei11.dll
至執行文件的同一個目錄下,開發過程中就是debug目錄。

 

至於如何使用問題,其實我上面已經有提及,使用非常簡單,以sql server 為例,假設你已經建好表Product(ID,Name,CategoryID),ID是自增列,
那么項目中引入兩個dll后,定義實體 Product :

public class Product
{
 public int ID {get;set;}
 public string Name {get;set;}
public int CategoryID {get;set;}

}

調用代碼如下
 EntityContext  context = new EntityContext("數據庫連接串");
 context.Insert(new Product(){Name="pppp", CategoryID=55});

 如果ID不是自增列,那么在實體在執行插入操作前需要賦值。 

 下載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM