博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于Castle ActiveRecord开发Domain Model详解(一)对象关系到数据表的映射
阅读量:5237 次
发布时间:2019-06-14

本文共 2965 字,大约阅读时间需要 9 分钟。

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

 
[BelongsTo("CustomerId")] public Customer Customer {
get { return customer; } set { customer = value; } }
 
 
Customer.cs
[HasMany(Lazy=true)] public ISet
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
Products {
get { return products; } set { products = value; } }

 

 

Product.cs

[HasAndBelongsToMany( Table="ProductCategory", ColumnKey="ProductId", ColumnRef="CategoryId", Lazy=true)] public ISet
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
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; } }

 

转载于:https://www.cnblogs.com/RCFans/archive/2008/11/16/1334679.html

你可能感兴趣的文章
C# Dynamic通用反序列化Json类型并遍历属性比较
查看>>
128 Longest Consecutive Sequence 一个无序整数数组中找到最长连续序列
查看>>
定制jackson的自定义序列化(null值的处理)
查看>>
auth模块
查看>>
javascript keycode大全
查看>>
前台freemark获取后台的值
查看>>
log4j.properties的作用
查看>>
游戏偶感
查看>>
Leetcode: Unique Binary Search Trees II
查看>>
C++ FFLIB 之FFDB: 使用 Mysql&Sqlite 实现CRUD
查看>>
Spring-hibernate整合
查看>>
c++ map
查看>>
exit和return的区别
查看>>
discuz 常用脚本格式化数据
查看>>
洛谷P2777
查看>>
PHPStorm2017设置字体与设置浏览器访问
查看>>
SQL查询总结 - wanglei
查看>>
安装cocoa pods时出现Operation not permitted - /usr/bin/xcodeproj的问题
查看>>
GIT笔记:将项目发布到码云
查看>>
JavaScript:学习笔记(7)——VAR、LET、CONST三种变量声明的区别
查看>>