王朝网络
分享
 
 
 

Snake.Net中的ORM(三)

王朝c#·作者佚名  2008-06-01
宽屏版  字体: |||超大  

5.抽象的数据访问层(Abstract DAL) 1) 先说一下几个接口(interface)EastASP.Enterprise.Objects.IObjectStoreProvider 此接口实现对象的Create, Update 和Delete操作。Eastasp.Enterprise.Objects.IObjectListProvider 此接口实现对象的Retrieve操作,在Snake.Net中,每个对象都需要一个唯一标识,根据这个唯一标识不但可以获取单个的对象实例,也可以通过IObjectListProvider接口获取一组对象集合的实例。Eastasp.Enterprise.Objects.IObjectQueryProvider 此接口实现对象的查询功能。Eastasp.Enterprise.Transactions.ISupportedTransaction此接口实现对象的事物操作。Snake.Net提供了一个高度封装的数据访问层类DataBindObjectDataAccess。DataBindObjectDataAccess实现了上述的所有接口,它是ORM中业务实体对象访问数据库的桥梁。虽然,在一般情况下,我们并不需要接触这个类,但是对这个类还是应该简单了解一下,这将有助于对Snake.Net更深层次的了解。DataBindObjectDataAccess对象是提供了实现了业务实体的的所有数据库访问操作包括创建,更新,删除,获取和查询的能力。

2)CRUD方法(即Create, Retrieve, Update, Delete方法) 曾几何时,程序员天天都将要面对一些简单又繁杂的工作,不停的编写Insert , Update , Delete和Select之类的SQL语句。现在ORM把我们从这种简单重复劳动中解放出来。通过ORM我们可以不再理会那些陈年的SQL语句,只需把精力关注于业务实体的建模中。现在让我们欣赏一下让我们看一下Snake.Net是如何实现CRUD操作的, 再以Customer实体为例,请看以下代码: //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();从上面的代码中我们可以发现进行Create和Update操作时都只需调用Object.Save(),Snake.Net将根据Object的State的状态值,自动判定是创建还是更新操作并执行。而对于Delete操作也只需要简单的调用一下Object.Delete ()方法。一切看起来太不可思议了,但事实的确如此简单。进行Retrieve操作时,我们应当先获取Customer实体的IObjectListProvider接口,然后根据Customer的唯一标识Unique,取得Customer的实例。我们把上面的代码拆分开来仔细观察下面的代码:

//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); 简单点说,要获取一个对象的实例,首先应当根据这个业务实体的类型,获取对应的ListProvider;然后,生成对象的唯一标识(在Snake.Net中所有的唯一标识都应当是实现IUnique接口的对象,Snake.Net内置定义了GuidToken、StringToken、Int64Token和Int32Token分别对应Guid, string, long, int类型);最后,根据唯一标识调用ListProvider的Get方法获取对象实体。 3)事务处理目前Snake.Net对事物处理,采用了以一种较为简单的方法。对于一个业务实体类而言,对其Save和Delete方法的调用,会自动实现对事务的支持。确切的说,假如一个业务实体的Save或Delete操作可能需要对多张表进行多步操作,那么这些操作将被自动包含在一个事务内,除非你通过配置文件,禁止使用事务。Snake.Net可以通过使用TransactionContext 对象处理一个事务块,包含在该事务块内所有Object对象的Save和Delete操作都将被视为在一个事务内执行。请看下面的代码:

//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;} 上述代码会将customer 和employee对象各自的Save方法视为一个事务行为,假如其中任何一个对象保存失败,对会引发事物回滚。非凡需要注重的是必须设置context.Consistent = true;这行代码,否则事务将不会被执行。当然TransactionContext对象也可以使用另一种手动方式执行(调用TransactionContext的Commit和Abort方法)。 4)查询 查询是ORM

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有