entity-framework-4 - Entity Framework 代码优先集合映射 - FriendRequests

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

我需要使用 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/

相关文章:

c# - 简单注入(inject)器:跨相同图的服务注入(inject)相同的UnitOfWork实例

c# - Entity Framework 插入未反射(reflect)在数据库中

entity-framework - 使用 EF Code-First 模型在保存或验证之前执行逻辑

c# - 如何在 EF4.3 代码优先中映射到复杂类型或从复杂类型映射?

orm - Entity Framework 4 代码仅从 POCO 域对象的 MetaData 获取表名

entity-framework - EF 中 ConcurrencyCheck 属性方法的问题

c# - 使用 POCO 和 t4 模板测试 EF 4.0 - 如何模拟上下文?

c# - Entity Framework - 无法让 LEFT OUTER join 工作

entity-framework-4.1 - 无法加载程序集 'system.data.entity,版本 4.2.0.0,

c# - EF4.1 代码优先 DbContext : The operation cannot be completed because the DbContext has been disposed