实体框架代码第一个集合映射 - FriendRequests

时间:2012-03-27 14:30:22

标签: entity-framework-4 entity-framework-4.1

我需要使用Entity Framework Code First映射多对多关系。它是一个标准的社交网络FriendRequests映射。用户对象具有类型为List<User>的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

如何在Entity Framework Code First中映射用户对象以通过连接表启用Collection?

1 个答案:

答案 0 :(得分: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; }
}

使用Fluent 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; }
}

使用Fluent API进行映射:

modelBuilder.Entity<User>()
    .HasMany(u => u.FriendRequests)
    .WithMany()
    .Map(m =>
    {
        m.ToTable("FriendRequests");
        m.MapLeftKey("UserId");
        m.MapRightKey("FriendId");
    });