实体代码第一个用户,角色,UserRole表

tom*_*tom 3 c# entity-framework code-first

我正在使用Entity Code First创建一个数据库和表来存储用户,角色和UserRoles.

我的课程如下 -

  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; }
}
Run Code Online (Sandbox Code Playgroud)

我的目的是通过UserRole表将用户连接到角色.

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

Sla*_*uma 8

您不需要该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; }
}
Run Code Online (Sandbox Code Playgroud)

如果您不需要或不想要其中一个集合(比如您不想要)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; }
}
Run Code Online (Sandbox Code Playgroud)