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

时间:2013-05-03 21:28:37

标签: 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; }
}

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

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

2 个答案:

答案 0 :(得分: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; }
}

如果您不需要或不想要其中一个集合,假设您不想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; }
}

答案 1 :(得分:0)

  

CF逆向工程师工具,但会产生大量过多的代码和   我想知道如何干净利落地做到这一点。

绝对同意。我的方法是使用Entity Framework Power Tools,但有时你需要手动选择干净的代码。 如何创建我已在其上回答的角色和用户之间的多对多关系here。而且您不需要UserRole实体。