ORM組件 ELinq (五) -映射配置之XML
上節介紹了基於FluentAPI的映射配置方式,本節我們將親自動手,一步一步搭建ELinq的XML映射程序來。備注我使用的開發環境:VS2010,Nuget 包管理器,SqlCe3.5
1.獲取ELinq
從Nuget 控制台下載安裝ELinq:install-package ELinq,安裝成功后,VS的項目就自動引用了ELinq.dll,並且自動添加了ELinq.xsd (xml mapping 的Schema 文件)、Northwind.cs和Northwind.Mapping.xml 等Demo文件,由於第一次使用,所以把Northwind.cs和Northwind.Mapping.xml這兩個文件先刪掉。
2. 建數據庫
打開SqlCe3.5 數據庫,建立客戶表:Customer ,過程略
3. 創建和設計持久化類
3-1創建和設計持久化類
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace XMLMappingDemo.PO { public class Customer { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } } }
3-2 編寫XML映射文件
提示:要為ELinq的XML映射配置添加智能提示功能,需要把ELinq.xsd 文件復制到X:\Program Files\Microsoft Visual Studio 10.0\Xml\Schemas目錄即可
ELinq.Xsd 定義了Mapping、Table、Id、Column、ComputedColumn、Association、Version等映射元素
創建Customer.Mapping.xml,並輸入如下內容
4. 創建和設計DbContext
4-1 創建DbConfiguration
注意:需要設置Customer.mapping.xml 文件的"Build Action"屬性為:null,"Copy To Output Directory"屬性為:Always
4-2 創建DbContext
class DemoContext:DbContext { static DbConfiguration configuration = DbConfiguration.ConfigureSqlCe35("Db.sdf") .SetSqlLogger(() => new SqlLog(Console.Out)) .AddFile(@"Mappings\Customer.mapping.xml") ; public DemoContext() : base(configuration) { } public IDbSet<Customer> Customers { get; set; } }
5. 測試
5.1 清空記錄
在進行測試前,先刪除所有記錄,並檢查表中的記錄一定為0
[Test] public void ClearAll() { using (var db = new DemoContext()) { db.Customers.Delete(p => true); Assert.AreEqual(0, db.Customers.Count()); } }
下面是輸出的SQL語句
DELETE FROM [Customer] WHERE 1=1 SELECT COUNT(*) FROM [Customer] AS t0
5-2 添加記錄
添加一條記錄,並檢查客戶Id已經自動返回
//插入 var customer = new Customer { FirstName = "風雲", LastName = "王" }; Assert.AreEqual(0, customer.Id); db.Customers.Insert(customer); Assert.IsTrue(customer.Id > 0);
SQL輸出
INSERT INTO [Customer]([FirstName], [LastName]) VALUES (@p0, @p1) -- p0:(DbType = String,Value = 風雲) -- p1:(DbType = String,Value = 王) SELECT @@IDENTITY AS [Id]
5-3 查詢記錄
為了確保上一步已經插入到數據庫中,這一步做一個查詢檢查,把查詢結果轉換成DataTable並輸出數據
//查詢 var items = from c in db.Customers where c.FirstName == "風雲" select c; var tb = Mapper.Map<IQueryable<Customer>, DataTable>(items); tb.WriteXml(Console.Out);
SQL輸出
SELECT t0.[Id], t0.[FirstName], t0.[LastName] FROM [Customer] AS t0 WHERE (t0.[FirstName] = @p0) -- p0:(DbType = String,Value = 風雲) <DocumentElement> <Customer> <Id>9</Id> <FirstName>風雲</FirstName> <LastName>王</LastName> </Customer> </DocumentElement>
5-4 更新記錄
customer.LastName = "dd"; var effectedRow = db.Customers.Update(customer); Assert.AreEqual(1, effectedRow);
SQL輸出
UPDATE [Customer] SET [FirstName] = @p0, [LastName] = @p1 WHERE (([Id]=9)) -- p0:(DbType = String,Value = 風雲) -- p1:(DbType = String,Value = dd)
5-5 查詢記錄
為了確保上一步已經更新到數據庫中,這一步做一個查詢檢查,把查詢結果轉換成DataTable並輸出數據
//查詢 items = from c in db.Customers where c.FirstName == "風雲" select c; tb = Mapper.Map<IQueryable<Customer>, DataTable>(items); tb.WriteXml(Console.Out);
SQL輸出
SELECT t0.[Id], t0.[FirstName], t0.[LastName] FROM [Customer] AS t0 WHERE (t0.[FirstName] = @p0) -- p0:(DbType = String,Value = 風雲) <DocumentElement> <Customer> <Id>9</Id> <FirstName>風雲</FirstName> <LastName>dd</LastName> </Customer> </DocumentElement>
5-6 刪除記錄
db.Customers.Delete(p => p.Id == customer.Id); Assert.AreEqual(0, db.Customers.Count());
SQL輸出
DELETE FROM [Customer] WHERE (([Id]=9)) SELECT COUNT(*) FROM [Customer] AS t0
結語
在這篇文章中,我們使用ELinq來構建了一個最基本的項目,沒有體現ELinq更多細節,只描繪了ELinq的Xml映射的以及單表的CRUD操作。當然使用ELinq有各種各樣的程序架構,本系列未做處理,更多實戰知識以后介紹,下一節將介紹基於約定的方式進行映射配置。
技術支持:
- 官方網站
- Nuge 下載頁面
- ORM組件 ELinq系列
- ORM組件 ELinq 更新日志
- ORM組件 ELinq 使用答疑
- 在我的博客留言,我會盡可能地抽時間來答復大家的問題。
- 加入 ELinq用戶的 QQ群(271342583)。
謝謝大家的閱讀,麻煩大伙點一下推薦,再次謝謝大家。 ^_^