6

这可能只是因为我缺乏对 EF Code First fluent API 的了解,但我很难过。

我想建模以下内容:

  • 具有 ID 和名称的Groups集合
  • 带有 Id 和 Name的用户集合
  • 每个用户都被分配到一个主要组
  • 每个用户可能有零个或多个辅助组

我要使用的表结构如下所示:

团体

  • ID
  • 姓名

用户

  • ID
  • 姓名
  • 主组 ID

次要组分配

  • 用户身份
  • 组 ID

我一直在努力尝试使用 EF Code First 对此进行建模,但我无法让它同时接受用户和组之间的关系。很抱歉没有发布任何 .NET 代码(我很高兴),但无论如何它可能都是错误的。

有没有办法让EF建模这个?我假设我必须使用 Fluent API 进行某种配置。也许更好的问题是:对于 Fluent API 是否有任何好的、明确的参考?

谢谢!

4

2 回答 2

16

试试这个(未经测试):

public class Group 
{
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<User> PrimaryUsers { get; set; }
    public virtual ICollection<User> SecondaryUsers { get; set; } 
}

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int PrimaryGroupId { get; set; }

    public virtual Group PrimaryGroup { get; set; }
    public virtual ICollection<Group> SecondaryGroups { get; set; }
}

public class Context : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Group> Groups { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<User>()
                    .HasRequired(u => u.PrimaryGroup)
                    .WithMany(g => g.PrimaryUsers)
                    .HasForeignKey(u => u.PrimaryGroupId)
                    .WillCascadeOnDelete(false);

        modelBuilder.Entity<User>()
                    .HasMany(u => u.SecondaryGroups)
                    .WithMany(g => g.SecondaryUsers)
                    .Map(m => m.MapLeftKey("UserId")
                               .MapRightKey("GroupId")
                               .ToTable("SecondaryGroupAssignments"));
    }
}
于 2011-06-03T15:02:42.183 回答
3

基于 Ladislav 的出色回答,以下是在不使用任何映射的情况下如何做到这一点 - 只是应用于模型类本身的属性:

public class Group 
{
    public int Id { get; set; }

    [MaxLength(300)]
    public string Name { get; set; }

    public ICollection<User> Users { get; set; }
}

public class User
{
    public int Id { get; set; }

    [MaxLength(300)]
    public string Name { get; set; }

    [ForeignKey("PrimaryGroup")]
    public int PrimaryGroupId { get; set; }
    [Required]
    public Group PrimaryGroup { get; set; }

    [InverseProperty("Users")]
    public ICollection<Group> SecondaryGroups { get; set; }
}

笔记

如果需要,可以将 virtual 关键字添加到 2ICollectionGroup. 这允许延迟加载。性能方面,我不推荐它,但它是可能的。

我包含MaxLength了具有任意(但安全)长度的属性300,因为在没有 MaxLength 的情况下将字符串放在 EF 中会使您的NVarChar(MAX)列性能低下。与所要求的内容完全无关,但最好发布好的代码。

我建议不要为您的 EF 类命名“用户”和“组”。它们将使您稍后尝试运行的任何 SQL 复杂化,必须键入 [User] 和 [Group] 才能访问它们,并且在 MVC 控制器中使用这些类会变得复杂,因为您的类User将与允许您访问的Context属性发生冲突UserAsp.Net 身份库。

于 2013-10-01T04:43:22.653 回答