我的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不是自增列,那么在實體在執行插入操作前需要賦值。