【问题标题】:Entity Code First User, Role, UserRole tables实体代码优先用户、角色、用户角色表
【发布时间】:2013-05-03 21:28:36
【问题描述】:

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

我的课如下——

  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 逆向工程师工具来做到这一点,但这会产生大量多余的代码,我想知道如何干净利落地做到这一点。

【问题讨论】:

    标签: c# entity-framework code-first


    【解决方案1】:

    您不需要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; }
    }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2013-04-28
        • 1970-01-01
        • 2015-06-14
        • 2017-01-28
        • 2015-05-06
        • 2011-01-05
        • 1970-01-01
        • 2015-11-02
        • 1970-01-01
        相关资源
        最近更新 更多