Castle ActiveRecord学习笔记四:各种映射
2011-10-23 13:03
441 查看
这里主要来说明ActiveRecord的属性与数据库及其字段的对应关系。
主要以ActiveRecordAttribute、PrimaryKeyAttribute、PropertyAttribute来进行说明。
首先,对于ActiveRecordAttribute来说,是指定数据库表名与类之间进行映射的,如果表名和类名一致,
则可以直接通过 [ActiveRecord] ,但是如果数据库表名与类名之间不一致,则可以显式的进行指定:比如类名为OrderInfo,而数据库表名为Order,则对应的关系可以通过[ActiveRecord("Order")]来进行指定。
ActiveRecordAttribute说明:
注意,里面的延迟加载问题,我在前面的文章中有过讨论。
其次就是PrimaryKeyAttribute属性的使用。这个从字面的意思上来看,就是指主键类型的。在一个表结构中,如果要指定主键,则可以使用这个属性名称来进行约束。 比如如果现有一个OrderID为主键,则可以这样的显示指定[PrimaryKey("OrderID")]或者[PrimaryKey(PrimaryKeyType.Identity,"OrderID")],但是如果这个字段和数据库的字段名称相同的话,直接可以隐式的来进行指定:[PrimaryKey],具体详细信息,请见下表:
PrimaryKeyAttribute说明
主键的生成方式介绍
最后就是要说的是PropertyAttribute,这个主要是表中的字段和类中的字段进行对应的,和前面一样,如果表字段名称和类字段名称一致,则可以直接利用[Property]来指定,否则需要利用[Property("OrderName")]来进行指定:
说明
下面是一个具体的例子:
数据库:
代码:
通过上面的映射,就可以使用了。具体的还有FieldAttribute,CompositeKeyAttribute,留待研究。
主要以ActiveRecordAttribute、PrimaryKeyAttribute、PropertyAttribute来进行说明。
首先,对于ActiveRecordAttribute来说,是指定数据库表名与类之间进行映射的,如果表名和类名一致,
则可以直接通过 [ActiveRecord] ,但是如果数据库表名与类名之间不一致,则可以显式的进行指定:比如类名为OrderInfo,而数据库表名为Order,则对应的关系可以通过[ActiveRecord("Order")]来进行指定。
ActiveRecordAttribute说明:
属性 | 说明 | 示例 |
Table | 指定持久化类所对应的数据库表名,如果表名与类名相同,可以省略 | [ActiveRecord("Blogs")] [ActiveRecord(Table="Blogs")] |
Schema | 指定Schema的名字 | Schema="ARDemo" |
Proxy | 指定一个接口,在延迟装载时作为代理使用 | |
DiscriminatorColumn | 识别器的字段名 | DiscriminatorColumn="Blog" |
DiscriminatorType | 识别器的字段类型 | DiscriminatorType="String" |
DiscriminatorValue | 识别器字段的值 | |
Where | 指定一个附加SQL的Where子句 | Where="IsPost = 0" |
Lazy | 指定是否延迟加载 | Lazy=true|false |
其次就是PrimaryKeyAttribute属性的使用。这个从字面的意思上来看,就是指主键类型的。在一个表结构中,如果要指定主键,则可以使用这个属性名称来进行约束。 比如如果现有一个OrderID为主键,则可以这样的显示指定[PrimaryKey("OrderID")]或者[PrimaryKey(PrimaryKeyType.Identity,"OrderID")],但是如果这个字段和数据库的字段名称相同的话,直接可以隐式的来进行指定:[PrimaryKey],具体详细信息,请见下表:
PrimaryKeyAttribute说明
属性 | 说明 | 示例 |
PrimaryKeyType | 主键生成的方式,如果不指定,则默认的方式为PrimaryKeyType.Native | PrimaryKeyType.Native |
Column | 主键字段名称,如果跟属性名相同,可以不用指定 | PrimaryKey("blog_id") |
ColumnType | 主键字段的类型 | |
Generator | 是一个.NET类的名字,用来为该持久化类的实例生成唯一的标识。 | |
Params | 用Params来提供Generator所需要的配置参数或初始化参数 | |
Length | 主键字段的长度 | Length=10 |
SequenceName | 当指定主键的生成方式为Sequence时,序列的名称 | PrimaryKey(PrimaryKeyType.Sequence, SequenceName="myseqname") |
UnsavedValue | 用来标志该实例是刚刚创建的,尚未保存。 |
名称 | 说明 |
Identity | 对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持,生成自增的整型 |
Sequence | 序列,对DB2,MySQL, PostgreSQL, Oracle的内置标识字段提供支持,生成自增的整型。 |
HiLo | 高低位,使用一个高/低位算法来高效的生成Int64, Int32 或者 Int16类型的标识符。 |
SeqHiLo | 使用序列的高低位,使用一个高/低位算法来高效的生成Int64, Int32 或者 Int16类型的标识符,给定一个数据库序列(sequence)的名字。 |
UuidHex | 用一个System.Guid和它的ToString(string format)方法生成字符串类型的标识符。 |
UuidString | 用一个新的System.Guid产生一个byte[] ,把它转换成字符串。 |
Guid | 用一个新的System.Guid 作为标识符。 |
GuidComb | 用Jimmy Nilsso的一个算法产生一个新的System.Guid。 |
Native | 根据底层数据库的能力选择 identity, sequence 或者 hilo中的一个。默认值。 |
Assigned | 让应用程序在自己为对象分配一个标示符。 |
Foreign | 使用另外一个相关联的对象的标识符。 |
说明
属性 | 说明 | 示例 |
Column | 对应的数据库字段名 | Property("blog_name") |
ColumnType | 对应的字段类型 | |
Formula | 一个SQL表达式,定义了这个计算(computed)属性的值。计算属性没有和它对应的数据库字段。 | |
UnsavedValue | 用来标志该实例是刚刚创建的,尚未保存。 | |
Length | 字段的长度 | Length=10 |
NotNull | 是否可以为空 | NotNull=true|false |
Unique | 是否允许重复 | Unique=true|false |
Update | 表明在用于UPDATE 的SQL语句中是否包含这个字段。默认为true | Update=true|false |
Insert | 表明在用于INSERT的SQL语句中是否包含这个字段。默认为true | Insert=true|false |
数据库:
USE [NewsDemo] GO /****** Object: Table [dbo].[Order] Script Date: 10/23/2011 12:59:40 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Order]( [OrderID] [int] IDENTITY(1,1) NOT NULL, [OrderName] [nvarchar](50) NULL, CONSTRAINT [PK_Order] PRIMARY KEY CLUSTERED ( [OrderID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO
代码:
using Castle.ActiveRecord; using System.Collections; namespace CastleLib { [ActiveRecord("Order")] public class OrderInfo:ActiveRecordBase { private int _OrderId; private string _OrderName; [PrimaryKey(PrimaryKeyType.Identity,"OrderId")] public int OrderId { get { return _OrderId; } set { _OrderId = value; } } [Property("OrderName")] public string OrderName { get { return _OrderName; } set { _OrderName = value; } } public static void DeleteAll() { DeleteAll(typeof(OrderInfo)); } public static IList FindAll() { return (IList)FindAll(typeof(OrderInfo)); } public static OrderInfo Find(int id) { return (OrderInfo)FindByPrimaryKey(typeof(OrderInfo), id); } } }
通过上面的映射,就可以使用了。具体的还有FieldAttribute,CompositeKeyAttribute,留待研究。
相关文章推荐
- Castle ActiveRecord学习实践(4):实现One-Many关系的映射
- Castle ActiveRecord学习实践(4):实现One-Many关系的映射
- Castle ActiveRecord学习实践(4):实现One-Many关系的映射
- C#.Net Castle ActiveRecord学习实践(3):映射基础
- Castle ActiveRecord学习实践(5):实现Many–Many关系的映射
- C#.Net Castle ActiveRecord学习实践(4):实现One-Many关系的映射
- C#.Net Castle ActiveRecord学习实践(5):实现Many–Many关系的映射
- C#.Net Castle ActiveRecord学习实践(8):数据有效性的验证
- Castle ActiveRecord 学习之 .net快速开发 (1)
- Castle ActiveRecord使用笔记
- Castle学习笔记----Castle.AvtiveRecord配置
- Castle学习笔记----认识Castle.AvtiveRecord
- C#.Net Castle ActiveRecord学习实践(9):使用ActiveRecord的一些技巧
- Castle ActiveRecord学习实践(11)——ActiveRecordMediator
- castle ActiveRecord入门实例(2)-映射管理
- C#.Net Castle ActiveRecord学习实践(10):深度分析Schema Pitfals
- Castle ActiveRecord学习实践(2):构建配置信息
- Castle ActiveRecord学习实践(5)继承
- Castle ActiveRecord学习实践(6):延迟加载和使用Where子句
- Castle ActiveRecord学习实践(8):数据有效性的验证