我需要使用 Entity Framework 代码优先来映射多对多关系。它是一个标准的社交网络 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 中的用户对象以通过连接表启用集合?
最佳答案
你可以这样试试:
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");
});
关于entity-framework-4 - Entity Framework 代码优先集合映射 - FriendRequests,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9891626/