entity-framework - EF Core 多对多关系表命名
问题描述
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
&中的 ID 属性Role
是键(数据库生成的身份)
User
和Role
实体共享一个many-to-many relationship
.
EF Core 在数据库中使用表名生成第三个表UsersRoles
有没有一种方法可以为第三个表名添加前缀,这样就Prefix.UsersRoles
无需手动添加UserRoles
映射的第三个实体User
并Role
为其赋予所需的名称Prefix
解决方案
使用 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; }
}
你的流利的 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; }
}
推荐阅读
- scala - 适用于 Play 2.6 和 Scala 2.12 的兼容 SBT 版本
- python - 为什么resample()后枚举多列时使用单括号不报错
- checkbox - 如何在可重复使用的 pug 模板中解析来自外部源(例如 json)的链接(或任何 HTML 标签)?
- c# - 关于多租户设置的分区策略问题
- mysql - 将 .csv 文件加载到 MySQL 数据库问题
- javascript - 在查看模式时停止滚动
- android - android上是否有任何通用API可以在任何前台窗口文本视图或编辑器上设置新字体
- php - 语法错误,Laravel 视图中出现意外的 '?>':D:..\WEB3\WEB\Pics\resources\views\home.blade.php
- java - 类型不匹配:数字、日期或字符串预期休眠 LocalDate
- javascript - Codemirror 不能使用变量来获取或设置值