NDO中的ActiveRecord 简介 2——强类型的活动记录

本文介绍了一种对象关系映射(ORM)的实现方式,通过具体的Region和Product类实例展示了如何使用ActiveRecord模式来操作数据库。文中详细解释了从数据加载、查询到增删改等常见操作,并提供了SQL输出作为对照。

Region和Products表的SCHEMA代码,Region表中的主键时赋值方式,Products中的主键是自动增一的

None.gif CREATE   TABLE   [ dbo ] . [ Region ]  (
None.gif    
[ RegionID ]   [ int ]   PRIMARY   KEY ,
None.gif    
[ RegionDescription ]   [ nchar ]  ( 50 NOT   NULL  
None.gif
None.gif
CREATE   TABLE   [ dbo ] . [ Products ]  (
None.gif    
[ ProductID ]   [ int ]   IDENTITY  ( 1 1 PRIMARY   KEY ,
None.gif    
[ ProductName ]   [ nvarchar ]  ( 40 NULL  ,
None.gif    
[ SupplierID ]   [ int ]   NULL  ,
None.gif    
[ CategoryID ]   [ int ]   NULL  ,
None.gif    
[ QuantityPerUnit ]   [ nvarchar ]  ( 20 NULL  ,
None.gif    
[ UnitPrice ]   [ money ]   NULL  ,
None.gif    
[ UnitsInStock ]   [ smallint ]   NULL  ,
None.gif    
[ UnitsOnOrder ]   [ smallint ]   NULL  ,
None.gif    
[ ReorderLevel ]   [ smallint ]   NULL  ,
None.gif    
[ Discontinued ]   [ bit ]   NOT   NULL  
None.gif

强类型活动记录类Region和Product代码:Region的ID属性包含get和set,而Product的ProductID属性只需要get即可,因为Product类映射的Products表的主键是自动增一的。

None.gif public   class  Region:ActiveRecord
ExpandedBlockStart.gif 1_34_257_Closed_Text.style.display='none'; Codehighlighter1_34_257_Open_Image.style.display='inline'; Codehighlighter1_34_257_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedBlock.gif" align=top>    
dot.gif {
InBlock.gif        
public new int ID
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
get dot.gifreturn (int)base.ID;}
ExpandedSubBlockStart.gifContractedSubBlock.gif            
set dot.gifbase.ID = value;}
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public string Description
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
getdot.gifreturn (string)this["RegionDescription"];}
ExpandedSubBlockStart.gifContractedSubBlock.gif            
set dot.gifthis["RegionDescription"= value;}
ExpandedSubBlockEnd.gif        }

InBlock.gif
ExpandedBlockEnd.gif    }

None.gif
None.gif    
public   class  Product:ActiveRecord 
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif {
ExpandedSubBlockStart.gifContractedSubBlock.gif        
public Product():base("Products")dot.gif{}
InBlock.gif        
InBlock.gif
InBlock.gif        
public int ProductID 
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
get 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
return (int)this.ID;
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public string ProductName 
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
get 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
return this["ProductName"].ToString();
ExpandedSubBlockEnd.gif            }

InBlock.gif            
set 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
this["ProductName"= value;
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public int SupplierID 
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
get 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
return (int)this.GetValue("SupplierID");
ExpandedSubBlockEnd.gif            }

InBlock.gif            
set 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
this.SetValue("SupplierID", value);
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public int CategoryID 
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
get 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
return (int)this.GetValue("CategoryID");
ExpandedSubBlockEnd.gif            }

InBlock.gif            
set 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
this.SetValue("CategoryID", value);
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public string QuantityPerUnit 
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
get 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
return this.GetValue("QuantityPerUnit").ToString();
ExpandedSubBlockEnd.gif            }

InBlock.gif            
set 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
this.SetValue("QuantityPerUnit", value);
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public decimal UnitPrice 
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
get 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
return (decimal)this.GetValue("UnitPrice");
ExpandedSubBlockEnd.gif            }

InBlock.gif            
set 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
this.SetValue("UnitPrice", value);
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public short UnitsInStock 
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
get 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
return (short)this.GetValue("UnitsInStock");
ExpandedSubBlockEnd.gif            }

InBlock.gif            
set 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
this.SetValue("UnitsInStock", value);
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public short UnitsOnOrder 
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
get 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
return (short)this.GetValue("UnitsOnOrder");
ExpandedSubBlockEnd.gif            }

InBlock.gif            
set 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
this.SetValue("UnitsOnOrder", value);
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public short ReorderLevel 
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
get 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
return (short)this.GetValue("ReorderLevel");
ExpandedSubBlockEnd.gif            }

InBlock.gif            
set 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
this.SetValue("ReorderLevel", value);
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public bool Discontinued 
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
get 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
return Convert.ToBoolean(this.GetValue("Discontinued"));
ExpandedSubBlockEnd.gif            }

InBlock.gif            
set 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
this.SetValue("Discontinued", value);
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

应用例子:

   1 数据加载Load ,或LoadByKey返回数据库中的一条记录,如果有多条只加载第一条记录

None.gif Product product  =   new  Product();
None.gifproduct.LoadByKey(
1 );
None.gif
this .Text  =  product.ProductName  +   " -------- "   +  product.SupplierID.ToString();
None.gif

 

SQL  输出

None.gif SELECT  
None.gif    
[ ProductID ] ,
None.gif    
[ ProductName ] ,
None.gif    
[ SupplierID ] ,
None.gif    
[ CategoryID ] ,
None.gif    
[ QuantityPerUnit ] ,
None.gif    
[ UnitPrice ] ,
None.gif    
[ UnitsInStock ] ,
None.gif    
[ UnitsOnOrder ] ,
None.gif    
[ ReorderLevel ] ,
None.gif    
[ Discontinued ]
None.gif
FROM
None.gif    
[ Products ]     
None.gif
WHERE
None.gif    
[ ProductID ]    =  @ProductID

2 数据加载 2

None.gif Product product  =   new   Products() ;
None.gifproduct.ID 
=   1 ;
None.gifproduct.Load();
None.gif
this.Text = product.ProductName + "--------" + product.SupplierID.ToString();

SQL  输出同上

3 返回所有记录

None.gif Product product  =   new  Product();
None.gifIList products 
=  product.Find();
   
foreach (Product p  in  products)
ExpandedBlockStart.gifContractedBlock.gif            
dot.gif {
InBlock.gif                Console.WriteLine(p.ProductName);
ExpandedBlockEnd.gif            }

None.gif

SQL 输出

None.gif SELECT  
None.gif    
[ ProductID ] ,
None.gif    
[ ProductName ] ,
None.gif    
[ SupplierID ] ,
None.gif    
[ CategoryID ] ,
None.gif    
[ QuantityPerUnit ] ,
None.gif    
[ UnitPrice ] ,
None.gif    
[ UnitsInStock ] ,
None.gif    
[ UnitsOnOrder ] ,
None.gif    
[ ReorderLevel ] ,
None.gif    
[ Discontinued ]
None.gif
FROM
None.gif    
[ Products ]

4 分页操作,取第3页,每页5条记录

None.gif Product product  =   new  Product();
None.gifIList products 
=  product.Find( 2 , 5 );
None.gif
foreach (Product p  in  products)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    Console.WriteLine(p.ProductName);
ExpandedBlockEnd.gif}

SQL  输出

None.gif SELECT   TOP   5   *    FROM  Products  WHERE  ProductID  >  ( SELECT   MAX (ProductID)  FROM  (  SELECT   TOP   10  ProductID  FROM  Products  ORDER   BY  ProductID  ASC AS  TMP)  ORDER   BY  ProductID  ASC
None.gif

4.2 分页操作2,取第3页,每页5条记录

None.gif Product product  =   new  Product();
None.gifproduct.Discontinued 
= false ;
None.gifIList products 
=  product.Find( 2 , 5 );
None.gif
foreach (Product p  in  products)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif                Console.WriteLine(p.ProductName);
ExpandedBlockEnd.gif}

SQL  输出

None.gif SELECT   TOP   5   *    FROM  (  SELECT   *   FROM   [ Products ]
None.gif
WHERE
None.gif    
[ Discontinued ] = @Discontinued )  AS  TMP  WHERE  TMP.ProductID  >  ( SELECT   MAX (TMP3.ProductID)  FROM  (  SELECT   TOP   10  TMP2.ProductID  FROM  (  SELECT   *   FROM
None.gif    
[ Products ]
None.gif
WHERE
None.gif    
[ Discontinued ] = @Discontinued )  AS  TMP2  ORDER   BY  TMP2.ProductID  ASC AS  TMP3)  ORDER   BY  TMP.ProductID  ASC
None.gif

5  多条件查询

None.gif Product product  =   new  Product();
None.gifproduct.SupplierID 
=   7 ;
None.gifproduct.CategoryID 
=   3 ;
None.gifIList products 
=  product.Find();
None.gif
foreach (Product p  in  products)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    Console.WriteLine(p.ProductName);
ExpandedBlockEnd.gif}

SQL  输出

None.gif SELECT  
None.gif    
[ ProductID ] ,
None.gif    
[ ProductName ] ,
None.gif    
[ SupplierID ] ,
None.gif    
[ CategoryID ] ,
None.gif    
[ QuantityPerUnit ] ,
None.gif    
[ UnitPrice ] ,
None.gif    
[ UnitsInStock ] ,
None.gif    
[ UnitsOnOrder ] ,
None.gif    
[ ReorderLevel ] ,
None.gif    
[ Discontinued ]
None.gif
FROM
None.gif    
[ Products ]
None.gif
WHERE
None.gif    
[ SupplierID ] = @SupplierID  AND
None.gif    
[ CategoryID ] = @CategoryID

5.2 多条件查询,通过Condition

None.gif Product product  =   new  Product();
None.gifCondition con 
=  product.SelectCommand
None.gif    .NewCondition(
" SupplierID " ==   7  
        &&  product.SelectCommand.NewCondition( " CategoryID " ==   3 ;
None.gifproduct.SelectCommand.Where(con);
None.gifIList products 
=  product.Find();
None.gif
foreach (Product p  in  products)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif                Console.WriteLine(p.ProductName);
ExpandedBlockEnd.gif}

SQL  输出同上

6  数据插入

None.gif Region rg  =   new  Region();
None.gifrg.ID 
=   7 ;
None.gifrg.Description 
=   " 77 " ;           
None.gifrg.Save();

SQL 输出

None.gif INSERT   INTO   [ Region ]  (
None.gif    
[ RegionID ] ,
None.gif    
[ RegionDescription ]
None.gif
VALUES  (
None.gif    @RegionID,
None.gif    @RegionDescription
None.gif)

6.2 数据插入2

None.gif Product product  =   new  Product();
None.gifproduct.ProductName 
= " Test ActiveRecord! " ;
None.gifproduct.SupplierID 
=   7 ;
None.gifproduct.CategoryID 
=   3 ;
None.gifproduct.QuantityPerUnit 
=   " test ! test ! " ;
None.gifproduct.UnitPrice 
=   0.5m ;
None.gifproduct.UnitsInStock 
=   5 ;
None.gifproduct.UnitsOnOrder 
=   3 ;
None.gifproduct.ReorderLevel 
=   10 ;
None.gifproduct.Discontinued 
=   true ;
None.gifproduct.Save();
None.gifConsole.WriteLine(product.ProductID);

SQL  输出

None.gif INSERT   INTO   [ Products ]  (
None.gif    
[ ProductName ] ,
None.gif    
[ SupplierID ] ,
None.gif    
[ CategoryID ] ,
None.gif    
[ QuantityPerUnit ] ,
None.gif    
[ UnitPrice ] ,
None.gif    
[ UnitsInStock ] ,
None.gif    
[ UnitsOnOrder ] ,
None.gif    
[ ReorderLevel ] ,
None.gif    
[ Discontinued ]
None.gif
VALUES  (
None.gif    @ProductName,
None.gif    @SupplierID,
None.gif    @CategoryID,
None.gif    @QuantityPerUnit,
None.gif    @UnitPrice,
None.gif    @UnitsInStock,
None.gif    @UnitsOnOrder,
None.gif    @ReorderLevel,
None.gif    @Discontinued
None.gif);
None.gif
select   CAST ( SCOPE_IDENTITY()  AS  BIGINT)

6.3  数据插入3,部分字段的插入

None.gif Product product  =   new  Product();
None.gifproduct.ProductName 
= " Test ActiveRecord! " ;
None.gifproduct.SupplierID 
=   7 ;
None.gifproduct.CategoryID 
=   3 ;
None.gifproduct.QuantityPerUnit 
=   " test ! test ! " ;
None.gifproduct.Discontinued 
=   true ;
None.gifproduct.Save();
None.gifConsole.WriteLine(product.ProductID);

SQL 输出

None.gif INSERT   INTO   [ Products ]  (
None.gif    
[ ProductName ] ,
None.gif    
[ SupplierID ] ,
None.gif    
[ CategoryID ] ,
None.gif    
[ QuantityPerUnit ] ,
None.gif    
[ Discontinued ]
None.gif
VALUES  (
None.gif    @ProductName,
None.gif    @SupplierID,
None.gif    @CategoryID,
None.gif    @QuantityPerUnit,
None.gif    @Discontinued
None.gif)
select CAST( SCOPE_IDENTITY() AS BIGINT)

7 数据更新

None.gifRegion  rg  =   new   Region() ;
None.gifrg.ID 
=  7 ;
   rg.Load();
None.gifrg.
Description   =  "7777" ;           
    rg.Save();

SQL 输出

None.gif SELECT  
None.gif    
[ RegionID ] ,
None.gif    
[ RegionDescription ]
None.gif
FROM
None.gif    
[ Region ]
None.gif
WHERE
None.gif    
[ RegionID ] = @RegionID
None.gif
None.gif
UPDATE   [ Region ]   SET  
None.gif    
[ RegionDescription ]   =  @RegionDescription
None.gif
WHERE
None.gif    RegionID 
=  @RegionID

7.2 数据更新,有选择性的只更新“脏”列

None.gif Product product  =   new  Product();
None.gifproduct.ID 
=   93 ;
None.gifproduct.Load();
None.gifproduct.ProductName 
= " Test Update ActiveRecord! " ;
None.gifproduct.QuantityPerUnit 
=   " test Update! test Update! " ;
None.gifproduct.Discontinued 
=   true ;
None.gifproduct.Save();

SQL  输出

None.gif SELECT  
None.gif    
[ ProductID ] ,
None.gif    
[ ProductName ] ,
None.gif    
[ SupplierID ] ,
None.gif    
[ CategoryID ] ,
None.gif    
[ QuantityPerUnit ] ,
None.gif    
[ UnitPrice ] ,
None.gif    
[ UnitsInStock ] ,
None.gif    
[ UnitsOnOrder ] ,
None.gif    
[ ReorderLevel ] ,
None.gif    
[ Discontinued ]
None.gif
FROM
None.gif    
[ Products ]
None.gif
WHERE
None.gif    
[ ProductID ] = @ProductID
None.gif
None.gif
UPDATE   [ Products ]   SET  
None.gif    
[ ProductName ]   =  @ProductName,
None.gif    
[ QuantityPerUnit ]   =  @QuantityPerUnit,
None.gif    
[ Discontinued ]   =  @Discontinued
None.gif
WHERE
None.gif    ProductID 
=  @ProductID

 

7.3 数据删除

None.gif Region  =   new Region() ;
None.gifrg.ID
= 6 ;
None.gifrg.Delete();

SQL  输出

None.gif DELETE   FROM   [ Region ]
None.gif
WHERE
None.gif    RegionID 
=  @RegionID

1.5 数据删除2(条件删除(活动记录里面封装了Table数据库表的元数据对象里面),也可以以Filter方式进行删除或Where子句的方式进行删除)

None.gifRegion  rg  =   new Region(); None.gif           
   Condition con  =  rg.DeleteCommand.NewCondition(rg.Table.Key.Columns[ 0 ].Name)  ==   6 ;
None.gifcon.Execute();
None.gif

SQL  输出 同上

上一篇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值