2012-03-27 101 views
4

我需要使用实体框架代码优先映射多对多关系。它是一个标准的社交网络FriendRequests映射。用户对象具有类型为List<User>的FriendRequests的集合。在数据库中我使用的连接表的关系如下:实体框架代码第一个集合映射 - FriendRequests

CREATE TABLE dbo.FriendRequests(
    UserId INT NOT NULL FOREIGN KEY REFERENCES dbo.Users(id), 
    FriendId INT NOT NULL FOREIGN KEY REFERENCES dbo.Users(id), 
    RequestDate SMALLDATETIME NOT NULL DEFAULT GETUTCDATE()) 
GO 
ALTER TABLE dbo.FriendRequests ADD PRIMARY KEY (UserId,FriendId) 
GO 

如何映射在实体框架代码首先,用户对象,以使通过连接表的集合?

回答

2

你可以试试这样说:

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"); 
    }); 
+0

的RequestDate属性不是必需的。如果我删除该列,是否有办法将其作为多对多来执行? – reach4thelasers 2012-03-27 15:35:28

+0

@ reach4thelasers:是的,看我的编辑。 – Slauma 2012-03-27 15:42:23

+0

感谢您的回应。我尝试了你的代码,并将一些示例数据放入连接表中来测试它,但我总是为user.FriendRequests.Count()获取0。我需要做些什么才能获取Joined集合? – reach4thelasers 2012-03-27 16:05:32