我们创建了一个数据模型(Model类),QDORM怎么去了解认识这个Model类呢?和Entity Framework一样,使用类的自定义特性(Attribute),以下称QDORM特性。
在ODORM里包含分两类特性:
1,
类特性,描述数据模型的行为或含义。
2,
字段特性,描述数据模型各属性与数据库中字段的映射关系。
如以下示例:
[DbSchema(TableName = "t_ PBOOK ")]
public class PBOOK : IModel
{
[Key]
public string ProCode { get; set; }
[DbColumn(IsMapping = false)]
public string ProName { get; set; }
}
其中[DbSchema(TableName = "t_ PBOOK ")]为类特性,[Key]与[DbColumn(IsMapping = false)]为字段特性。
那么,QDORM中现共包含多少特性,各特性又各自代表什么意思呢?
一、DbSchema特性DbSchema特性只能用于描述类,它包含两个属性:
1,
TableName:对应于数据库中的表名。比如有时候我们创建的数据模型类名为PBOOK,但对应于数据库的表名为t_PBOOK,那么我们可以使用该属性与之对应。如果没有设置该属性,则默认类名等于表名。
2,
SelectName:取数的表名或视图名。如果有设置该属性,那么我们使用QDORM从数据库中取数据模型时(如第一节中的dbConfig.Model.GetModelByPrimaryKey<Book >() 方法),就会从SelectName指定的表或视图中取数。如果没有设置该属性,则默认为TableName属性。
DbSchema特性的源码如下:
/// <summary >
/// 对应数据库表特性
/// </summary >
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public class DbSchema : Attribute
{
/// <summary >
/// 对应表名
/// </summary >
public string TableName { get; set; }
/// <summary >
/// 取数的表名或视图表
/// </summary >
public string SelectName { get; set; }
}
二、Key特性Key特性只能用于描述类的属性,如果某属性设置了该Key特性,QDORM则认为该属性对应的数据库表字段为主键。Key特性只包含一个属性Order:
1,
Order:描述主键的顺序,如果表只包含一个主键,Order可以不设置值,但如果表包含了多个主键,则必须为Order设置值,且值不能相等。
Key特性源码如下:
/// <summary >
/// 主键
/// </summary >
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
public class Key : Attribute
{
/// <summary >
/// 主键顺序
/// </summary >
public int Order { get; set; }
}
三、DbColumn特性DbColumn特性只能用于描述类的属性,它包含了多个属性,分别如下:
1,
Identity:自增量,描述当前属性对应的数据库字段是否为自增量。
2,
IsCompute:计算列,描述当前属性对应的数据库字段是否为计算列。
3,
IsMapping:是否映射数据库中字段。 这个属性非常方便,如果我们的类中某个属性返回值是程序计算的结果,不是从数据库中取的值。那么可以将该属性设置为false,QDORM在对模型的“增删改查“操作中就会忽略该属性。该属性默认值为true。
4,
ColumnName:数据库中列名,描述当前属性对应数据库中的那个列。如果不设置该属性,则默认为列名和属性名相同。
5,
IsIgnoreInsert:插入数据时是否忽略当前属性。这个好理解了,比如数据库中有一个“修改时间“列,这个列在插入数据时是不用保存值的。我们将该属性设置为true,则不用担心在插入数据时是否为“修改时间“赋了值,即使是赋了值,QDORM也会忽略掉该值。
6,
IsIgnoreModify:修改数据时是否忽略当前属性。和IsIgnoreInsert相对应,比如数据库中有一个“创建时间“列,这个列应该是插入数据时赋值,且后面不再能被修改。我们将该属性设置为true,则不用担心在修改数据时是否为“创建时间“赋了值,即使是赋了值,QDORM也会忽略掉该值。
7,
IsUnique:是否唯一(保存数据时依据IsUnique组合判断数据的唯一性)。这个用于批量保存数据,比如我们要批量保存一批身份证号,因为身份证号是不允许重复的,那么我们可将身份证号这个属性的IsUnique设置为true,则QDORM在保存数值时会先检查身份证号是否重复。可以同时为多个类属性设置该特性,QDORM会依据IsUnique组合判断数据是否有重复。
DbColumn特性源码如下:
/// <summary >
/// 对应数据库列特性
/// </summary >
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = true)]
public class DbColumn : Attribute
{
/// <summary >
/// 是否自增量
/// </summary >
public bool Identity { get; set; }
/// <summary >
/// 是否计算列
/// </summary >
public bool IsCompute { get; set; }
private bool _IsMapping = true;
/// <summary >
/// 是否映射数据库中的列
/// </summary >
public bool IsMapping
{
get { return _IsMapping; }
set { _IsMapping = value; }
}
/// <summary >
/// 数据库中列名
/// </summary >
public string ColumnName { get; set; }
/// <summary >
/// 插入数据时是否忽略当前属性
/// </summary >
public bool IsIgnoreInsert { get; set; }
/// <summary >
/// 修改数据时是否忽略当前属性
/// </summary >
public bool IsIgnoreModify { get; set; }
/// <summary >
/// 查找数据时是否忽略当前属性
/// </summary >
public bool IsIgnoreSelect { get; set; }
/// <summary >
/// 是否唯一(保存数据时依据IsUnique组合判断数据的唯一性)
/// </summary >
public bool IsUnique { get; set; }
}