实体框架 4.1 代码优先自引用一对多和多对多关联
我有一个用户可以拥有他喜欢的用户集合...
另一个用户可以拥有他喜欢的用户集合...
如果用户 A 喜欢用户 B 并且用户 B 喜欢用户 A,那么他们就可以出去玩。我需要向对方发送他们的联系信息。我们如何在 Entity Framework Code First 中表示这样的模型?
public class User
{
public int UserId { get; set; }
public int? UserLikeId { get; set; }
public virtual UserLike UserLike { get; set; }
}
public class UserLike
{
public int UserLikeId { get; set; }
public int UserId { get; set; }
public virtual User User { get; set; }
public virtual ICollection<User> LikeUsers { get; set; }
}
这个模型正确吗?我无法让它发挥作用。
我尝试了另一种方法,但这也不起作用...
我尝试将用户集合添加到用户表中。
例如:
public virtual ICollection<User> userlike { get; set; }
public class User
{
public int UserId { get; set; }
public virtual ICollection<UserLike> UserLikes { get; set; }
}
public class UserLike
{
public int UserLikeId { get; set; }
public int UserId { get; set; }
public virtual User User { get; set; }
public int LikeUserId { get; set; }
public virtual User LikeUser { get; set; }
}
当我尝试添加用户及其喜欢的人时,我收到此错误:
检测到关系“UserLike_LikeUser”的角色“UserLike_LikeUser_Target”发生冲突的更改。
表示这种模型的最佳方式是什么?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
你并不真的需要一个单独的实体来描述这种关系,下面的对象模型就可以解决这个问题:
现在假设你手里有一个 UserId,并且想要找到喜欢这个用户的其他用户,而这个用户也喜欢他:
更新1:
自引用多对多关联将使用连接表映射到数据库,这需要不同的对象模型和流畅的API:
更新2:
正如我在这篇文章,多对多关联不能有有效负载(例如EventId),如果是这种情况,那么我们必须将其分解为两个一对多关联到一个中间类,我可以看到您已经正确创建了这个类(UserLike)来表示附加到您的自引用多对多关联的额外信息,但是这个中间类的关联不正确,因为我们需要定义正如我在以下对象模型中所示,从 UserLike 到 User 正好有 2 个多对一关联:
现在您可以使用以下 LINQ 查询来检索所有互相喜欢的用户:
希望这会有所帮助。
You don't really need a separate entity to describe the relationship, the object model below will do the trick:
Now let's say you have a UserId in your hand and want to find the other User who likes this user which this user also like him:
Update 1:
A self referencing many-to-many association will be mapped to database using a join table which require a different object model and fluent API altogether:
Update 2:
As I explained in this post, a many-to-many association cannot have a payload (e.g EventId), and if that’s the case then we have to break it down to two one-to-many associations to an intervening class and I can see you’ve correctly created this class (UserLike) to represent the extra information attached to your self-referencing many-to-many association but the associations from this intermediate class are not correct as we need to define exactly 2 many-to-one association from UserLike to User like I showed in the following object model:
Now you can use the following LINQ query to retrieve all the users who like each other:
Hope this helps.