【问题标题】:EF Core Many-to-Many Relation Table Naming [duplicate]EF Core多对多关系表命名[重复]
【发布时间】:2021-10-26 11:03:54
【问题描述】:

EF Core 是否提供命名映射到数据库表的多对多关系的方法?

在代码优先模式中,我有以下 2 个实体:

[Table("Prefix.Users")]
public class User
{
    public int ID { get; set; }
    public IEnumerable<Role> Roles { get; set; }
}


[Table("Prefix.Roles")]
public class Role
{
    public int ID { get; set; }
    public IEnumerable<User> Users { get; set; }
}

我在这里跳过了详细的实体结构。 User & Role 中的 ID 属性是键(数据库生成的身份)

UserRole 实体共享一个 many-to-many relationship

EF Core 在数据库中生成第三个表,表名UsersRoles

有没有一种方法可以为第三个表名添加前缀,使其变为Prefix.UsersRoles,而无需手动添加映射UserRole 的第三个实体UserRoles 并为其指定所需的名称Prefix

【问题讨论】:

标签: entity-framework entity-framework-core ef-code-first many-to-many


【解决方案1】:

使用 fluent API 而不是使用数据注释

你的模型类应该是这样的。

 public class User
 {
    public int Id { get; set; }
    public string Username { get; set; }
    public string Email { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Password { get; set; }

     public virtual ICollection<UserRole> UserRoles { get; set; }
}

public class Role
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    public virtual ICollection<UserRole> UserRoles { get; set; }
}

public class UserRole
{
    public int UserId { get; set; }
    public int RoleId { get; set; }

    public virtual User User { get; set; }
    public virtual Role Role { get; set; }

}

你的 fluent api 配置类是这样的

public class UserConfiguration : IEntityTypeConfiguration<User>
{
    public void Configure(EntityTypeBuilder<User> builder)
    {
        builder.ToTable("User");

        builder.HasKey(x => x.Id);
    }
}
public class RoleConfiguration : IEntityTypeConfiguration<Role>
{
    public void Configure(EntityTypeBuilder<Role> builder)
    {
        builder.ToTable("Role");

        builder.HasKey(x => x.Id);
    }
}

public class UserRoleConfiguration : IEntityTypeConfiguration<UserRole>
{
    public void Configure(EntityTypeBuilder<UserRole> builder)
    {
        builder.ToTable("UserRole");

        builder.HasKey(x => new { x.UserId, x.RoleId });

        builder
            .HasOne<Role>(s => s.Role)
            .WithMany(r => r.UserRoles)
            .HasForeignKey(s => s.RoleId).OnDelete(DeleteBehavior.Restrict);

        builder
            .HasOne<User>(s => s.User)
            .WithMany(r => r.UserRoles)
            .HasForeignKey(s => s.UserId).OnDelete(DeleteBehavior.Restrict);

    }
}

你的 DbContext 类应该是这样的

public class MyDbContext : DbContext
{
    public EEGDbContext()
    {
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            optionsBuilder.UseSqlServer(@"Server=xxxx;Database=DB;User Id=sa;Password=xxxxx;");
        }
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.ApplyConfiguration(new UserConfiguration());
        modelBuilder.ApplyConfiguration(new RoleConfiguration());
        modelBuilder.ApplyConfiguration(new UserRoleConfiguration());

        base.OnModelCreating(modelBuilder);
    }

    public DbSet<User> Users { get; set; }
    public DbSet<Role> Roles { get; set; }
    public DbSet<UserRole> UserRoles { get; set; }

}

【讨论】:

  • 感谢@Erandika 的精心回复。我有点希望如果可以跳过第三个实体UserRole 创建,并且 EF Core 会像现在这样处理它(我当前的设置),我们仍然可以选择一个 自定义表名.
猜你喜欢
  • 2021-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-02
  • 2019-01-19
  • 1970-01-01
  • 1970-01-01
  • 2021-03-03
相关资源
最近更新 更多