基于Castle ActiveRecord开发Domain Model详解(一)对象关系到数据表的映射
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; } }
[HasMany(Lazy=true)]public ISet<Order> Orders {get { return orders; }set { orders = value; } }
[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; } }
public class Product { [OneToOne]public ProductDetail Detail { get; set; } }
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详解(一)对象关系到数据表的映射相关推荐
- 基于YOLOv5的目标检测系统详解(附MATLAB GUI版代码)
摘要:本文重点介绍了基于YOLOv5目标检测系统的MATLAB实现,用于智能检测物体种类并记录和保存结果,对各种物体检测结果可视化,提高目标识别的便捷性和准确性.本文详细阐述了目标检测系统的原理,并给 ...
- Spring基于注解TestContext 测试框架使用详解
原创整理不易,转载请注明出处:Spring基于注解TestContext 测试框架使用详解 代码下载地址:http://www.zuidaima.com/share/1775574182939648. ...
- php 实例 规范,PHP开发规范实例详解
本文主要和大家分享PHP开发规范实例详解,希望能帮助到大家. 源文件 代码使用<?php开头 ,忽略闭合标签?> 文件格式必须是无BOM UTF-8格式 一个文件只声明一种类型,如clas ...
- 微软Visual Studio2005开发工具路线图详解
微软Visual Studio2005开发工具路线图详解 随着企业需要的不断演变,Microsoft 依旧致力于提供创新的开发人员工具来满足这些不断变化的需求,从而确保客户的成功.为帮助组织规划未来的 ...
- Linux驱动开发必看详解神秘内核(完全转载)
Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html IT168 技术文档]在开始步入Lin ...
- iOS开发证件要点详解
iOS开发证书要点详解 引言 关于开发证书配置(Certificates&Identifiers&Provisioning Profiles),相信做iOS开发的同学没少被折腾.对于一 ...
- SpringCloud分布式开发五大组件详解
SpringCloud分布式开发五大组件详解 https://blog.csdn.net/weixin_40910372/article/details/89466955 服务发现--Netflix ...
- Android网络开发技术实战详解
<Android网络开发技术实战详解> 基本信息 作者: 朱桂英 丛书名: Android移动开发技术丛书 出版社:电子工业出版社 ISBN:9787121173493 上架时间:2012 ...
- 基于Amos路径分析的模型拟合参数详解
基于Amos路径分析的模型拟合参数详解 1 卡方.自由度.卡方自由度比 2 GFI.AGFI 3 RMR.RMSEA 4 CFI 5 NFI.TLI(NNFI) 6 ECVI 7 AIC.BIC.CA ...
最新文章
- signature=65a5d6b0ac441e09ae68e9bbee76cba1,Bortezomib
- 怎样取SAP中的业务对象状态
- Bootstrap之栅格系统
- 在deepin 15.5中安装vs code并配置c/c++环境
- 变量 常量 作用域和命名规范
- Web前端笔记-移动端触屏移动视角(two.js)
- linux 命令行工具无敌斩
- java 左侧菜单栏收缩_页面左侧可收缩菜单案例
- python设计模式14-命令模式
- 最快的Java序列化框架Protostuff简介
- PHP get_class_methods函数用法
- IBC 2019 五篇文章阅读笔记
- 计算机id和密码忘了怎么办,苹果账号密码忘记了怎么办_苹果忘了id账号和密码的处理方法...
- C++后台开发应该读的书
- c语言怎么编程24小时制,[C语言][PTA] 7-7 12-24小时制
- 《JAVA编程思想》学习笔记:第8章(多态)
- 广东工业大学计算机研究生学硕就业,广州大学与广东工业大学2018年MPAcc就业平均薪资解析!...
- 移动H5调试神器 vConsole
- stm32HALL库学习之二
- 孔子的名言,值得一生品读!