4

我使用实体代码优先创建一个数据库和表来存储用户、角色和用户角色。

我的课程如下 -

  public class User
  {
        public int UserId { get; set; }
        public string Username { get; set; }
        public string Password { get; set; }
  }


 public class Role
 {
        public int RoleId { get; set; }
        public string Rolename { get; set; }
 }


public class UserRole
{
    public int UserRoleId { get; set; }
    public int UserId { get; set; }
    public int RoleId { get; set; }

    public virtual User User { get; set; }
    public virtual Role Role { get; set; }
}

class ConfigurationContext : DbContext
{
    public ConfigurationContext()
    {
        Database.SetInitializer<ConfigurationContext>(new DropCreateDatabaseIfModelChanges<ConfigurationContext>());
    }

    public DbSet<Role> Roles { get; set; }
    public DbSet<User> Users { get; set; }
    public DbSet<UserRole> UserRoles { get; set; }
}

我的意图是通过 UserRole 表将用户连接到角色。

我可以通过创建表并使用 CF 逆向工程师工具来做到这一点,但这会产生大量多余的代码,我想知道如何干净地做到这一点。

4

2 回答 2

9

你不需要UserRole实体。EF 可以通过在没有该实体的数据库中创建适当的链接表来自动管理多对多关系。

最简单的解决方案是向您的UserRole实体添加两个集合。EF 将按照约定检测多对多关系,无需进一步显式配置:

public class User
{
    public int UserId { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }

    public virtual ICollection<Role> Roles { get; set; }
}

public class Role
{
    public int RoleId { get; set; }
    public string Rolename { get; set; }

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

class ConfigurationContext : DbContext
{
    public ConfigurationContext()
    {
        Database.SetInitializer<ConfigurationContext>(
            new DropCreateDatabaseIfModelChanges<ConfigurationContext>());
    }

    public DbSet<Role> Roles { get; set; }
    public DbSet<User> Users { get; set; }
}

如果您不需要或不想要其中一个集合,比如说您不想要Role.Users,那么您仍然可以通过使用 Fluent API 定义一个集合来创建多对多关系:

public class User
{
    public int UserId { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }

    public virtual ICollection<Role> Roles { get; set; }
}

public class Role
{
    public int RoleId { get; set; }
    public string Rolename { get; set; }
}

class ConfigurationContext : DbContext
{
    public ConfigurationContext()
    {
        Database.SetInitializer<ConfigurationContext>(
            new DropCreateDatabaseIfModelChanges<ConfigurationContext>());
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>()
            .HasMany(u => u.Roles)
            .WithMany()
            .Map(m => {
                m.ToTable("UserRoles");
                m.MapLeftKey("UserId");
                m.MapRightKey("RoleId");
            });
    }

    public DbSet<Role> Roles { get; set; }
    public DbSet<User> Users { get; set; }
}
于 2013-05-03T21:40:02.943 回答
0

CF 逆向工程师工具,但是它会产生大量多余的代码,并且想知道如何干净地做到这一点。

绝对同意。我的方法是使用Entity Framework Power Tools,但有时您仍需要手动选择干净的代码。在角色和用户之间创建多对多关系怎么样?我已经在这里回答过了。而且您不需要 UserRole 实体。

于 2013-05-03T21:40:32.953 回答