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<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; }
}

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

基于Castle ActiveRecord开发Domain Model详解(一)对象关系到数据表的映射相关推荐

  1. 基于YOLOv5的目标检测系统详解(附MATLAB GUI版代码)

    摘要:本文重点介绍了基于YOLOv5目标检测系统的MATLAB实现,用于智能检测物体种类并记录和保存结果,对各种物体检测结果可视化,提高目标识别的便捷性和准确性.本文详细阐述了目标检测系统的原理,并给 ...

  2. Spring基于注解TestContext 测试框架使用详解

    原创整理不易,转载请注明出处:Spring基于注解TestContext 测试框架使用详解 代码下载地址:http://www.zuidaima.com/share/1775574182939648. ...

  3. php 实例 规范,PHP开发规范实例详解

    本文主要和大家分享PHP开发规范实例详解,希望能帮助到大家. 源文件 代码使用<?php开头 ,忽略闭合标签?> 文件格式必须是无BOM UTF-8格式 一个文件只声明一种类型,如clas ...

  4. 微软Visual Studio2005开发工具路线图详解

    微软Visual Studio2005开发工具路线图详解 随着企业需要的不断演变,Microsoft 依旧致力于提供创新的开发人员工具来满足这些不断变化的需求,从而确保客户的成功.为帮助组织规划未来的 ...

  5. Linux驱动开发必看详解神秘内核(完全转载)

    Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html IT168 技术文档]在开始步入Lin ...

  6. iOS开发证件要点详解

    iOS开发证书要点详解 引言 关于开发证书配置(Certificates&Identifiers&Provisioning Profiles),相信做iOS开发的同学没少被折腾.对于一 ...

  7. SpringCloud分布式开发五大组件详解

    SpringCloud分布式开发五大组件详解 https://blog.csdn.net/weixin_40910372/article/details/89466955 服务发现--Netflix ...

  8. Android网络开发技术实战详解

    <Android网络开发技术实战详解> 基本信息 作者: 朱桂英 丛书名: Android移动开发技术丛书 出版社:电子工业出版社 ISBN:9787121173493 上架时间:2012 ...

  9. 基于Amos路径分析的模型拟合参数详解

    基于Amos路径分析的模型拟合参数详解 1 卡方.自由度.卡方自由度比 2 GFI.AGFI 3 RMR.RMSEA 4 CFI 5 NFI.TLI(NNFI) 6 ECVI 7 AIC.BIC.CA ...

最新文章

  1. signature=65a5d6b0ac441e09ae68e9bbee76cba1,Bortezomib
  2. 怎样取SAP中的业务对象状态
  3. Bootstrap之栅格系统
  4. 在deepin 15.5中安装vs code并配置c/c++环境
  5. 变量 常量 作用域和命名规范
  6. Web前端笔记-移动端触屏移动视角(two.js)
  7. linux 命令行工具无敌斩
  8. java 左侧菜单栏收缩_页面左侧可收缩菜单案例
  9. python设计模式14-命令模式
  10. 最快的Java序列化框架Protostuff简介
  11. PHP get_class_methods函数用法
  12. IBC 2019 五篇文章阅读笔记
  13. 计算机id和密码忘了怎么办,苹果账号密码忘记了怎么办_苹果忘了id账号和密码的处理方法...
  14. C++后台开发应该读的书
  15. c语言怎么编程24小时制,[C语言][PTA] 7-7 12-24小时制
  16. 《JAVA编程思想》学习笔记:第8章(多态)
  17. 广东工业大学计算机研究生学硕就业,广州大学与广东工业大学2018年MPAcc就业平均薪资解析!...
  18. 移动H5调试神器 vConsole
  19. stm32HALL库学习之二
  20. 孔子的名言,值得一生品读!

热门文章

  1. 写在前面——说说我的故事
  2. mlf机器人无限制格斗_极战MLF无限制机器人格斗大赛The Railgun称王
  3. 视频监控知识100问
  4. 前端学习--js.2
  5. Linux实战教学笔记13-定时任务补充
  6. 解决论文查重时参考文献被标红的方法
  7. Python 实现数字的打印
  8. 认真不一定会赢,但至少不会输
  9. java 生成 图片
  10. mysql admin ubuntu_ubuntu 安装 phpmyadmin、adminer