NBearV3——ORM实体关系设计速查手册
七、自定义关联
分析:除了以上常规的关联关系之外,NBear还支持使用CustomQuery设置自定义查询关联属性。CustomQuery可以实现在普通的1对1、1对多和多对多关联查询的基础上附加额外的约束条件。它和上面的常规查询的不同在于,自定义查询关联的对象不会被级联更新。这些额外的约束条件一般也是一些简单条件,但是灵活运用还是可以极大的减少我们的业务类代码。
下面的例子比较复杂,读者请留神看了。首先,这里主要包括三个实体Team,Group和User。Team和User是一对多关联,User和Group是多对多关联,这两个关系和我们上面演示的类似。但是,User实体还包含了一些附加的CustomQuery关联属性: 
public interface Team : Entity { [PrimaryKey] Guid ID { get; set; } string Name { get; set; } bool IsAvailable { get; set; } [FkQuery("Team", OrderBy = "{Name} DESC", Contained = true, LazyLoad = true)] User[] Users { get; set; } } public interface User : Entity { [PrimaryKey] Guid ID { get; set; } string Name { get; set; } [ManyToManyQuery(typeof(UserGroup), LazyLoad = true)] Group[] Groups { get; set;} [FkReverseQuery(LazyLoad = true)] Team Team { get; set;} [CustomQuery("{LeaderName} = @Name AND {IsPublic} = 1")] Group[] PublicLeadingGroups { get; set; } [CustomQuery("{IsAvailable} = 1", OrderBy="{Name}")] Team AvailableTeams { get; set; } [CustomQuery("{IsHidden} = 1", RelationType=typeof(UserGroup), OrderBy="{ID} DESC")] Group[] DivingGroups { get; set; } } public interface Group : Entity { [PrimaryKey] Guid ID { get; set; } string Name { get; set; } string LeaderName { get; set; } bool IsPublic { get; set; } [ManyToManyQuery(typeof(UserGroup), LazyLoad = true)] User[] Users { get; set; } } [Relation] public interface UserGroup : Entity { [RelationKey(typeof(User))] Guid UserID { get; set; } [RelationKey(typeof(Group))] Guid GroupID { get; set; } bool IsHidden { get; set;} }
注意,其中User.PublicLeadingGroups表示公开的,LeaderName是User.Name的所有Groups;User.AvailableTeams代表系统中所有IsAvailable的Team;特别注意User.DivingGroups代表了User所在的,但是,又是潜水(意思是User在Group中的状态对Group中的其他成员是不可见的)的Groups,这个DivingGroups的CustomQuery标注的特殊之处在于,它的查询约束条件”{IsHidden} = 1”中的IsHidden是User和Group的关联实体UserGroup中的属性,所以,这个CustomQuery标注也包含了RelationType属性指定了关联实体是UserGroup。同时,我们也可以使用OrderBy属性,指定默认的排序规则。
0
相关文章