基于Castle ActiveRecord开发Domain Model详解(一)对象关系到数据表的映射
2008-11-16 22:29
639 查看
Castle Project非常庞大,ActiveRecord是其中一个非常适合用于Domain Model开发的O/R Mapping框架。它使用.NET的反射特性无需配置文件,集成NHibernate完成数据层持久化功能,根据创建的Model生成数据表,这使得我们在Domain Model的开发中,只需要致力于业务对象关系的分析和定义,大大简少了工作量。
开发环境:
Windows Server 2003 Enterprise + IIS 6.0
CastleProject-1.0-RC3
Visual Studio 2008
.NET Framework 3.5
Oracle 9i
Code Smith 4.1(如果你先定义好了数据表,可用于生成实体类,但它不支持复合主键)
NUnit 2.4.8.0
首先我们来看看ActiveRecord的官方示例MoreComplexSample-vs2003中几个类的关系图:
ActiveRecord的实体类需要在类名上标记[ActiveRecord]。
[BelongsTo] + [HasMany] 表示两个对象的一对多关系
[BelongsTo("ColumnName")] 生成ColumnName的列作为外键。一个Order只有一个Customer(belongs to)。
[HasMany] 不会生成列,Customer可以有多个Order(has many)。如果类中BelongsTo的属性类型不是这个类本身,那么它的类型中必须有对应的HasMany(或HasAndBelongsToMany),否则使用ActiveRecordStarter初始化时会报错。
生成数据表关系如下图所示:
Order.cs
Customer.cs
而对于Category,它使用自身的类型定义Parent属性并标记[BelongsTo],代码如下:
将生成一个带有Parent外键,指向自身主键的Category表。
[HasAndBelongsToMany] 表示多对多关系并生成关系表
[HasAndBelongsToMany(Table="TableName", ColumnKey="ColumnName", ColumnRef="ColumnName")]
HasAndBelongsToMany将以指定的表名生成两个类的关联表,ColumnKey、ColumnRef分别代表这个类与关系对象在TableName中提供作外键的列名。例中Category与Product是多对多关系:
Category.cs
Product.cs
两个对象中均标记为HasAndBelongsToMany并且表、列对应,ActiveRecord将生成一个名为ProducCategory,包含ProductID和CategoryID的关系表。
如果关系表恰恰也被定义作为了类,如LineItem,它在Order.cs中已经被使用[HasAndBelongsToMany]进行了表名定义,那么,它需要用两个BelongsTo来表示对Order和Product的关系映射。
Order.cs
LineItem.cs
除本例所用到的关系之外,还有[OneToOne]表示一对一关系:
在对应的ProductDetail类中需要在主键上标记[PrimaryKey(PrimaryKeyType.Foreign)]来表示它的主键同时是外键:
开发环境:
Windows Server 2003 Enterprise + IIS 6.0
CastleProject-1.0-RC3
Visual Studio 2008
.NET Framework 3.5
Oracle 9i
Code Smith 4.1(如果你先定义好了数据表,可用于生成实体类,但它不支持复合主键)
NUnit 2.4.8.0
首先我们来看看ActiveRecord的官方示例MoreComplexSample-vs2003中几个类的关系图:
ActiveRecord的实体类需要在类名上标记[ActiveRecord]。
[BelongsTo] + [HasMany] 表示两个对象的一对多关系
[BelongsTo("ColumnName")] 生成ColumnName的列作为外键。一个Order只有一个Customer(belongs to)。
[HasMany] 不会生成列,Customer可以有多个Order(has many)。如果类中BelongsTo的属性类型不是这个类本身,那么它的类型中必须有对应的HasMany(或HasAndBelongsToMany),否则使用ActiveRecordStarter初始化时会报错。
生成数据表关系如下图所示:
Order.cs
[BelongsTo("CustomerId")] public Customer Customer { get { return customer; } set { customer = value; } }
Customer.cs
[HasMany(Lazy=true)] public ISet<Order> Orders { get { return orders; } set { orders = value; } }
而对于Category,它使用自身的类型定义Parent属性并标记[BelongsTo],代码如下:
[BelongsTo("ParentId")] public Category Parent { get { return parent; } set { parent = value; } }
将生成一个带有Parent外键,指向自身主键的Category表。
[HasAndBelongsToMany] 表示多对多关系并生成关系表
[HasAndBelongsToMany(Table="TableName", ColumnKey="ColumnName", ColumnRef="ColumnName")]
HasAndBelongsToMany将以指定的表名生成两个类的关联表,ColumnKey、ColumnRef分别代表这个类与关系对象在TableName中提供作外键的列名。例中Category与Product是多对多关系:
Category.cs
[HasAndBelongsToMany( Table="ProductCategory", ColumnKey="CategoryId", ColumnRef="ProductId", Inverse=true, Lazy=true)] public ISet<Product> Products { get { return products; } set { products = value; } }
Product.cs
[HasAndBelongsToMany( Table="ProductCategory", ColumnKey="ProductId", ColumnRef="CategoryId", Lazy=true)] public ISet<Category> Categories { get { return categories; } set { categories = value; } }
两个对象中均标记为HasAndBelongsToMany并且表、列对应,ActiveRecord将生成一个名为ProducCategory,包含ProductID和CategoryID的关系表。
如果关系表恰恰也被定义作为了类,如LineItem,它在Order.cs中已经被使用[HasAndBelongsToMany]进行了表名定义,那么,它需要用两个BelongsTo来表示对Order和Product的关系映射。
Order.cs
[HasAndBelongsToMany( Table="LineItem", ColumnKey="OrderId", ColumnRef="ProductId", Inverse = true, Lazy = true)] public ISet<Product> Products { get { return products; } set { products = value; } }
LineItem.cs
[BelongsTo("OrderId", NotNull = true, UniqueKey = "ConstraintName")] public Order Order { get { return order; } set { order = value; } } [BelongsTo("ProductId", NotNull = true, UniqueKey = "ConstraintName")] public Product Product { get { return product; } set { product = value; } }
除本例所用到的关系之外,还有[OneToOne]表示一对一关系:
public class Product { [OneToOne] public ProductDetail Detail { get; set; } }
在对应的ProductDetail类中需要在主键上标记[PrimaryKey(PrimaryKeyType.Foreign)]来表示它的主键同时是外键:
public class ProductDetail { [PrimaryKey(PrimaryKeyType.Foreign)] public int ProductID { get; set; } }
相关文章推荐
- Castle ActiveRecord学习实践(5):实现Many–Many关系的映射
- C#.Net Castle ActiveRecord学习实践(4):实现One-Many关系的映射
- C#.Net Castle ActiveRecord学习实践(5):实现Many–Many关系的映射
- 基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - 数据关系映射ORM
- Castle ActiveRecord学习实践(4):实现One-Many关系的映射
- Castle ActiveRecord学习实践(4):实现One-Many关系的映射
- Castle ActiveRecord学习实践(4):实现One-Many关系的映射
- JNI/NDK开发指南(三)——JNI数据类型及与Java数据类型的映射关系
- 对象关系与数据表映射
- 在VS 2005 下搭建Castle Active Record + Access 开发环境实例
- 详解python django面向关系数据库的ORM对象映射系统(1)
- 使用ActiveReport for .net 进行报表开发(三)--显示对象集合中的数据
- 使用ActiveReport for .net 进行报表开发(三)--显示对象集合中的数据
- CSDN Android客户端开发(二):详解如何基于Java用Jsoup爬虫HTML数据
- C#.Net Castle ActiveRecord学习实践(3):映射基础
- spring(11)使用对象-关系映射持久化数据
- Extraction应用构建平台应用基础(八)------数据类型和Java对象的映射关系篇
- 本文是笔者根据数据库编程经验,利用C++语言的模板、继承、授权、多态等面向对象特性,借鉴命令模式,实现了对象在关系数据中的存储,降低应用系统与数据库之间的耦合,提高开发效率。
- 使用 Castle ActiveRecord 开发发现的一些问题
- 使用ActiveReport for .net 进行报表开发(三)--显示对象集合中的数据 (转)