国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Snake.Net中的ORM(三)

2019-11-17 05:25:23
字體:
供稿:網(wǎng)友
5.抽象的數(shù)據(jù)訪問層(Abstract DAL)       1)  先說一下幾個(gè)接口(interface)Eastasp.EnterPRise.Objects.IObjectStoreProvider 此接口實(shí)現(xiàn)對(duì)象的Create, Update 和Delete操作。Eastasp.Enterprise.Objects.IObjectListProvider 此接口實(shí)現(xiàn)對(duì)象的Retrieve操作,在Snake.Net中,每個(gè)對(duì)象都需要一個(gè)唯一標(biāo)識(shí),根據(jù)這個(gè)唯一標(biāo)識(shí)不但可以獲取單個(gè)的對(duì)象實(shí)例,也可以通過IObjectListProvider接口獲取一組對(duì)象集合的實(shí)例。Eastasp.Enterprise.Objects.IObjectQueryProvider 此接口實(shí)現(xiàn)對(duì)象的查詢功能。Eastasp.Enterprise.Transactions.ISupportedTransaction此接口實(shí)現(xiàn)對(duì)象的事物操作。Snake.Net提供了一個(gè)高度封裝的數(shù)據(jù)訪問層類DataBindObjectDataaccess。DataBindObjectDataAccess實(shí)現(xiàn)了上述的所有接口,它是ORM中業(yè)務(wù)實(shí)體對(duì)象訪問數(shù)據(jù)庫的橋梁。雖然,在一般情況下,我們并不需要接觸這個(gè)類,但是對(duì)這個(gè)類還是應(yīng)該簡單了解一下,這將有助于對(duì)Snake.Net更深層次的了解。DataBindObjectDataAccess對(duì)象是提供了實(shí)現(xiàn)了業(yè)務(wù)實(shí)體的的所有數(shù)據(jù)庫訪問操作包括創(chuàng)建,更新,刪除,獲取和查詢的能力。
        2)CRUD方法(即Create, Retrieve, Update, Delete方法) 曾幾何時(shí),程序員天天都將要面對(duì)一些簡單又繁雜的工作,不停的編寫Insert , Update , Delete和Select之類的SQL語句?,F(xiàn)在ORM把我們從這種簡單重復(fù)勞動(dòng)中解放出來。通過ORM我們可以不再理會(huì)那些陳年的SQL語句,只需把精力關(guān)注于業(yè)務(wù)實(shí)體的建模中?,F(xiàn)在讓我們欣賞一下讓我們看一下Snake.Net是如何實(shí)現(xiàn)CRUD操作的, 再以Customer實(shí)體為例,請看以下代碼:  //declareCustomer customer;IObjectProviderFactory factory; //Createcustomer = new Customer("AROWT");customer.CompanyName = "Eastasp.com";customer.ContactName = "BrUCe";customer.ContactTitle = "owner";customer.Address = "Avda. de la Constituci¨®n 2222";customer.City = "Tsawassen";customer.Region = "BC";customer.PostalCode = "S-958 22";customer.Country = "UK";customer.Phone = "0621-08460";customer.Fax = "0621-08924";customer.Save();
 //get provider factoryfactory = DataBindObject.ProviderFactory; try{//Retrievecustomer = (Customer)factory.GetListProvider(typeof(Customer)).Get(new StringToken("AROWT"));}catch(ObjectNotFoundException ex){Console.Write("Cann't found object.");throw ex;} //Updatecustomer.Phone =  "0321-02420";customer.Save(); //Deletecustomer.Delete();從上面的代碼中我們可以發(fā)現(xiàn)進(jìn)行Create和Update操作時(shí)都只需調(diào)用Object.Save(),Snake.Net將根據(jù)Object的State的狀態(tài)值,自動(dòng)判定是創(chuàng)建還是更新操作并執(zhí)行。而對(duì)于Delete操作也只需要簡單的調(diào)用一下Object.Delete ()方法。一切看起來太不可思議了,但事實(shí)的確如此簡單。進(jìn)行Retrieve操作時(shí),我們應(yīng)當(dāng)先獲取Customer實(shí)體的IObjectListProvider接口,然后根據(jù)Customer的唯一標(biāo)識(shí)Unique,取得Customer的實(shí)例。我們把上面的代碼拆分開來仔細(xì)觀察下面的代碼:
 //declareUnique unique;Customer customer;IObjectListProvider provider;IObjectProviderFactory factory;        //get list providerfactory = DataBindObject.ProviderFactory;provider = factory.GetListProvider(typeof(Customer)); //create uniqueunique = new StringToken("AROWT"); //get objectcustomer = (Customer)provider.Get(unique);       簡單點(diǎn)說,要獲取一個(gè)對(duì)象的實(shí)例,首先應(yīng)當(dāng)根據(jù)這個(gè)業(yè)務(wù)實(shí)體的類型,獲取對(duì)應(yīng)的ListProvider;然后,生成對(duì)象的唯一標(biāo)識(shí)(在Snake.Net中所有的唯一標(biāo)識(shí)都應(yīng)當(dāng)是實(shí)現(xiàn)IUnique接口的對(duì)象,Snake.Net內(nèi)置定義了GuidToken、StringToken、Int64Token和Int32Token分別對(duì)應(yīng)Guid, string, long, int類型);最后,根據(jù)唯一標(biāo)識(shí)調(diào)用ListProvider的Get方法獲取對(duì)象實(shí)體。 3)事務(wù)處理目前Snake.Net對(duì)事物處理,采用了以一種較為簡單的方法。對(duì)于一個(gè)業(yè)務(wù)實(shí)體類而言,對(duì)其Save和Delete方法的調(diào)用,會(huì)自動(dòng)實(shí)現(xiàn)對(duì)事務(wù)的支持。確切的說,假如一個(gè)業(yè)務(wù)實(shí)體的Save或Delete操作可能需要對(duì)多張表進(jìn)行多步操作,那么這些操作將被自動(dòng)包含在一個(gè)事務(wù)內(nèi),除非你通過配置文件,禁止使用事務(wù)。Snake.Net可以通過使用TransactionContext 對(duì)象處理一個(gè)事務(wù)塊,包含在該事務(wù)塊內(nèi)所有Object對(duì)象的Save和Delete操作都將被視為在一個(gè)事務(wù)內(nèi)執(zhí)行。請看下面的代碼:
 //declareCustomer customer;Employee employee; //use transactionsusing(TransactionContext context = TransactionContext.Create()){        //create customercustomer = new Customer("AROWT");customer.CompanyName = "Eastasp.com";customer.ContactName = "Bruce";customer.ContactTitle = "owner";customer.Address = "Avda. de la Constituci¨®n 2222";customer.City = "Tsawassen";customer.Region = "BC";customer.PostalCode = "S-958 22";customer.Country = "UK";customer.Phone = "0621-08460";customer.Fax = "0621-08924";customer.Save();
 //create employeeemployee = new Employee();employee.LastName = "a";employee.FirstName = "b";employee.Title = "Mr.";employee.BirthDate = new DateTime(1988, 2, 2);employee.Save(); //must set consistentcontext.Consistent = true;} 上述代碼會(huì)將customer 和employee對(duì)象各自的Save方法視為一個(gè)事務(wù)行為,假如其中任何一個(gè)對(duì)象保存失敗,對(duì)會(huì)引發(fā)事物回滾。非凡需要注重的是必須設(shè)置context.Consistent = true;這行代碼,否則事務(wù)將不會(huì)被執(zhí)行。當(dāng)然TransactionContext對(duì)象也可以使用另一種手動(dòng)方式執(zhí)行(調(diào)用TransactionContext的Commit和Abort方法)。 4)查詢 查詢是ORM


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 井陉县| 自贡市| 长子县| 遂川县| 太康县| 衡山县| 广昌县| 丹棱县| 广饶县| 稻城县| 同仁县| 五河县| 绥化市| 安岳县| 涪陵区| 大英县| 中宁县| 司法| 伽师县| 灵川县| 井冈山市| 卢湾区| 宝兴县| 额济纳旗| 峨眉山市| 巴彦县| 惠东县| 淳化县| 泊头市| 东城区| 噶尔县| 沾益县| 邹平县| 绿春县| 池州市| 凌源市| 石渠县| 湟中县| 宽城| 杭锦旗| 佳木斯市|