当前位置: 首页 > 编程语言 > C#

NHibernate,映射一个集合,其中key可以是两个不同的列分享

时间:2023-04-11 00:04:33 C#

,它与A有两个关联。A有一个B的集合。如果关联的A之一是加载的A的父级,则该集合必须加载任何B。问题是A上的集合映射必须根据检查过滤子项两个A关联中的一个是否是父关联。我怎样才能做到这一点?注意:顺序无关紧要,因此您可以使用bag建议一些映射。注2:请建议如何使用XML映射实现此目的,我不会在代码中这样做。更新:真实场景:这都是关于友谊的实现。我想映射实体UserProfile中的友谊集合。Friendship有两个表示关系的关联:OneUser、OtherUser。如果我想让我所有的朋友都能找到我,我需要检查两个属性,因为如果其中一个属性是我自己,那么我的朋友就是我的朋友。如果您愿意将解决方案略微移出数据域,您的用户可以与他们指定为朋友的其他用户建立一对多关系。如果您不希望它被泄露,这可以是受保护的或私有的。然后,您实现一个公共属性,将实际友谊定义为需要双向关系。也许是这样的:publicListFriends{this.assignedFriends.Where(f=>f.assignFriends.Contains(this)).ToList();如果你这样做,你将需要确保你使用二级缓存形式,否则你将不得不请求这个属性会破坏你的数据库。如果您需要返回专用Friendship对象的集合,这取决于您如何持久化这些条目以及如何映射该类。一种选择是将Friendship定义为只有三列,一个主键和两个返回用户表的外键。每当有人试图添加朋友时,您都需要一些逻辑:首先您需要检查一半的关系是否已经存在。varf=session.Query().Where(x=>x.User1==YourCurrentUser).Cacheable().FirstOrDefault();然后,如果存在,则分配关系的另一半f.User2=TheOtherUser;否则创建一个新对象:f=newFriendship();f.User1=YourCurrentUser;在任何分支之后:session.SaveOrUpdate(f);然后User的好友变成公共属性List{session.Query().Where(f=>f.User1!=null&&f.User2!=null&&(f.User1==this||f.User2==this)).Cacheable().ToList();请注意,我不在我的VS安装附近。请原谅打字错误,或者如果我犯了一个明显的错误(我在凌晨2:30的地方)这不是真正的答案,但我需要能够格式化并且没有字符限制。我有同样的问题,但由于解决方案不是很容易,我决定通过修改我的结构来解决它。我看到的一些看起来很有前途的东西是SQLQueries,它返回对象作为通过Queryover连接的别名。或者-添加一个.Where子句到“hasMany”映射。我读到的有关此选项的所有内容都说它非常有限。在执行您要求的逻辑时似乎很简单-选择Distinct...From...Where(OneUser=UserIdorOtherUser=UserId)编辑:在此处查看JoinQueryOver:http://nhibernate.info/blog/2009/12/17/queryover-in-nh-3-0.html和本机SQL查询:http://knol.google.com/k/nhibernate-chapter-14-native-sql#虽然这不是映射级别的解决方案,您可以在选择用户时在where子句中指定条件,以便正确填充他们的朋友。如果你不能用FluentQueryOver实现你想要的过滤,我认为你可以使用NativeSQL查询来创建别名并使用JoinQueryOver/JoinAlias相应地填充Friends集合。如果这是您已知的所有信息,我深表歉意。无论哪种方式-我都很有兴趣看到这个问题的解决方案。**编辑2:**我玩了一下,这是我能得到的最接近的:PublicClassUserMappingInheritsClassMap(OfUser)PublicSubNew()Id(Function(x)x.Id)。Column("UserID")Map(Function(x)x.Name).Length(50).Not.Nullable().Column("UserName")HasMany(Function(x)x.Friends).Inverse.KeyColumn("UserID").Where("Users.UserIDin(selectFriendships.FriendOnefromFriendshipswhereFriendships.FriendTwo=UserID)orUserIDin(selectFriendships.FriendTwofromFriendshipswhereFriendships.FriendOne=UserID)")Table("Users")EndSubEndClass查询效率较低,因为它继续在where子句中添加额外的约束,UserID需要等于外部userId,这违背了子查询的目的。我看过另一篇文章,其中提供了另外两种解决方案。创建两个子集合。一个将当前用户映射为主要朋友的朋友,另一个将当前用户映射为次要朋友。然后,您可以创建一个属性,在NH查询之外将它们合并在一起。在数据库中创建冗余条目,以便每个用户都有一个条目,它是与其他人共享的所有关系的PrimaryUser。基于这两个选项——我可能会选择选项#1。以上是C#学习教程:NHibernate,映射一个集合,其中key可以是两个不同列共享的全部内容。如果对大家有用,需要了解更多C#学习教程,希望大家多加关注——本文来自网络收藏,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: