你可以试试这样说:
public class User
{
public int Id { get; set; }
public ICollection<FriendRequest> FriendRequests { get; set; }
}
public class FriendRequest
{
public int UserId { get; set; }
public int FriendId { get; set; }
public DateTime RequestDate { get; set; }
public User User { get; set; }
public User Friend { get; set; }
}
映射用流利的API:
modelBuilder.Entity<User>()
.HasMany(u => u.FriendRequests)
.WithRequired(f => f.User)
.HasForeignKey(f => f.UserId);
modelBuilder.Entity<FriendRequest>()
.HasKey(f => new { f.UserId, f.FriendId });
modelBuilder.Entity<FriendRequest>()
.HasRequired(f => f.Friend)
.WithMany()
.HasForeignKey(f => f.FriendId);
因为在链路表中RequestDate
属性不能映射这是一个许多一对多关系。相反,您需要两个如上所示的一对多关系。
可能你需要禁用级联删除,我不确定。您可以通过在两个一对多映射的末尾附加.WillCascadeOnDelete(false)
来完成此操作。
编辑
您的意见:如果删除RequestDate
列您可以创建一个多一对多的关系模型。你不需要在这种情况下FriendRequest
实体:
public class User
{
public int Id { get; set; }
public ICollection<User> FriendRequests { get; set; }
}
映射用流利的API:
modelBuilder.Entity<User>()
.HasMany(u => u.FriendRequests)
.WithMany()
.Map(m =>
{
m.ToTable("FriendRequests");
m.MapLeftKey("UserId");
m.MapRightKey("FriendId");
});
的RequestDate属性不是必需的。如果我删除该列,是否有办法将其作为多对多来执行? – reach4thelasers 2012-03-27 15:35:28
@ reach4thelasers:是的,看我的编辑。 – Slauma 2012-03-27 15:42:23
感谢您的回应。我尝试了你的代码,并将一些示例数据放入连接表中来测试它,但我总是为user.FriendRequests.Count()获取0。我需要做些什么才能获取Joined集合? – reach4thelasers 2012-03-27 16:05:32