public class User { [Key] public Guid Id { get; set; } ...... }
至此我们实现了基本的数据库操作的自动化。
是不是很熟悉,和Entity Framework很类似是不是?
二、自定义实体类与数据库表的映射关系
上文中的简单增删改查操作,是根据对象实例得到对象类型从而得到类型名称和属性(Property)集合及他们的名称,那么如果实体类型的名称与数据库表名称并不一样怎么办呢?如果数据实体的属性(Property)与数据库表字段并不一一对应怎么办呢?
在大型项目中,这种情况是经常存在的,对于复杂的数据库表设计,到了业务层,可能会有不同的解释方法,例如我有一张用户表,包含了产品不同维度的信息:基本信息、扩展信息等。到了业务实现层面,我希望展开为两个不同的实体对象进行操作,基本信息对象和扩展信息对象。他们所使用的字段可能不太相同,却又包括了某些共通的字段,如Id,姓名。
如上文所说,升讯威ADO.NET增强组件没有强制的实体类与数据库表的映射关系要求,数据库表中的字段多少与实体类中的属性多少,或者说表中有的,实体类中没有,都没有关系,实体类中有的,通过Attribute标记是否映射即可。
1.数据库表名的映射指定
我们定义两个不同的实体类:
[Table("User")] public class User_BaseInfo { [Key] public Guid Id { get; set; } public string Name { get; set; } public int Age { get; set; } }
[Table("User")] public class User_ExtraInfo { [Key] public Guid Id { get; set; } public string ExtraInfo { get; set; } }
只需在类型定义前加上 TableAttribute ,对 User_BaseInfo 或 User_ExtraInfo 类的对像实例进行操作,直接使用上文中的增删改查方法即可。至此我们已经开始解除了实体类与数据库表结果的强关联。
2.数据库表字段的映射指定
此处严格来讲,并非一般ORM中针对 数据库表字段 的映射,而是针对 结果集字段 的映射。比如说通过复杂SQL,存储过程得到的结果集,根本不是数据库中的表。
在某些场景中,实体类中需要额外定义一些属性,用于存储特定信息或实现特定功能,这些数据并不需要进行持久化存储。或是实体类中的属性名称与数据库表字段名称存在不完全相同的情况,如将一张表映射到多个数据实体后,为了区别描述,以及基于复杂查询(SQL,存储过程)得到的结果集中的字段名。
)] public class User_ExtraInfo { [Key] public Guid Id { get; set; } [Column("ExtraInfo")] public string Infomation { get; set; } [NotMapped] public int Count { get; set; } }
只需在属性定义前加上 ColumnAttribute 或 NotMapped ,使用上文中的增删改查方法即可实现相应的操作。
3.实体类对数据库表的多对多映射
此功能用于将二维的数据库表(或结果集)进一步强类型化。