日期:2014-05-20  浏览次数:20897 次

对象关系映射概念性示例(怀疑ORM者请进)
***引言***

过去我一直怀疑ORM,感觉它充其量可以用在小型的、具有简单业务模型和数据关系的项目中。复杂的项目,即使我们用尽了各种复杂的SQL“技巧”,还嫌不够,ORM再聪明,怎么可以生成那么复杂,有时简直是任意复杂的SQL语句呢?

直到有一天,我妻子无意中告诉我:织一件带花样图案的毛衣,其实只需要两根竹钎和一条毛线,织女甚至可以心不在焉地织!我终于恍然大悟,我们用惯了各种复杂SQL语句和DBMS提供的专有技术,是因为我们的业务模型和业务逻辑的设计实在太差,甚至没有设计!我们是被迫用千百根针和千百条线痛苦地编制只有我们自己才能理解的图案。

——   ORM不但适用于小项目,更适用于大项目。越是复杂的项目,受益越明显。

 
***业务对象模型***

我们将采用一个定单的数据模型。这个数据模型其实很复杂,涉及若干个业务对象(类和相应的数据库表),至少应该有5个:
1.   定单(Orders)
2.   定单明细(Order   Details)
3.   厂家(Manufacturers)
4.   客户(Customers)
5.   产品(Products)

这5个业务对象以及它们之间的关系分别用下面5个C#类来大致表示:

[Table(”TBL_MANUFACTURER”)]
public   class   ManufacturerClass   //厂家
{
          [Column(”ID”)]   public   string   ID;
          [Column(”NAME”)]   public   string   Name;
          [Column(”CITY”)]   public   string   City;
          [Column(”ADDRESS”)]   public   string   Address;
          [Column(”BANK_AACOUNT”)]   public   string   BankAccount;
          [Column(”TAX_ACCOUNT”)]   public   string   TaxAccount;
          ......
  }

[Table(”TBL_CUSTOMER”)]
public   class   CustomerClass   //   客户
{
          [Column(”ID”)]   public   string   ID;
          [Column(”NAME”)]   public   string   Name;
          [Column(”CITY”)]   public   string   City;
          [Column(”ADDRESS”)]   public   string   Address;
          [Column(”BANK_AACOUNT”)]   public   string   BankAccount;
          [Column(”TAX_ACCOUNT”)]   public   string   TaxAccount;
          ......
}

[Table(”TBL_PRODUCT”)]
public   class   ProductClass   //   产品
{
          [Column(”ID”)]   public   string   ID;
          [Column(”NAME”)]   public   string   Name;
          [Column(”PRICE”)]decimal   Price;
          [RELATION(KeyColumn=”MANUFACTURER_ID”)]  
public   ManufacturerClass   Manufacturer;   //厂家
          ......
}

[Table(”TBL_ORDER”)]
public   class   OrderClass   //   定单
{
        [Column(”ID”)]   public   string   ID;
        [Column(”DATE”)]   datetime   string   Date;
        [Column(”DELIVERY_ADDRESS”)]   public   string   DelieveryAddress;
        [Relation(KeyColumn=”CUSTOMER_ID”)]   public   CustomerClass   Customer;     //客户
[Relation(KeyColumn=”ORDER_ID”,   IsDetail=true)]
public   OrderDetailClass[]   Details;   //定单明细,数组,一对多主从关系
          ......
}

[Table(”TBL_ORDERDETAIL”)]
public   class   OrderDetailClass   //定单明细
{
          [Relation(KeyColumn=”ORDER_ID”)]   public   OrderClass   Order;//   定单对象
          [Relation(KeyColumn=”PRODUCT_ID”)]   public   ProductClass   Product;   //产品