实体代码第一User, Role, UserRole表

本文关键字:Role UserRole User 代码 实体 | 更新日期: 2023-09-27 18:12:07

我使用实体代码首先创建一个数据库和表来存储用户,角色和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逆向工程工具来做到这一点,但这会产生大量多余的代码,并想知道如何干净地做到这一点。

实体代码第一User, Role, UserRole表

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

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

绝对同意。我的方法是使用实体框架电动工具,但有时仍然需要手动选择干净的代码。如何在角色和用户之间创建多对多的关系,我已经在这里回答过了。并且不需要UserRole实体