gpt4 book ai didi

c# - 实体代码优先用户、角色、用户角色表

转载 作者:行者123 更新时间:2023-11-30 13:58:34 25 4
gpt4 key购买 nike

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

我的类(class)如下-

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

最佳答案

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

关于c# - 实体代码优先用户、角色、用户角色表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16367801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com