C# .NET Core 2.2迁移生成器无法删除索引
我试图从IdentityUserRole表中名为UserRole的列中删除索引/外键 UserRole有两列。UserId和RoleId。两者都是主键C# .NET Core 2.2迁移生成器无法删除索引,c#,entity-framework,asp.net-core,.net-core,entity-framework-core,C#,Entity Framework,Asp.net Core,.net Core,Entity Framework Core,我试图从IdentityUserRole表中名为UserRole的列中删除索引/外键 UserRole有两列。UserId和RoleId。两者都是主键 protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); var rolesTable = modelBuilder.Entity<Role>().ToTab
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
var rolesTable = modelBuilder.Entity<Role>().ToTable("Role");
var userRolesTable = modelBuilder.Entity<UserRole>().ToTable("UserRole");
var userClaimsTable = modelBuilder.Entity<IdentityUserClaim<string>>().ToTable("UserClaim");
var usersTable = modelBuilder.Entity<User>().ToTable("User");
modelBuilder.Entity<Role>(builder =>
{
builder.Metadata.RemoveIndex(new[] { builder.Property(u => u.NormalizedName).Metadata });
});
modelBuilder.Entity<UserRole>(builder =>
{
builder.Metadata.RemoveIndex(new[] { builder.Property(u => u.RoleId).Metadata});
});
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
基于模型创建(modelBuilder);
var rolesTable=modelBuilder.Entity().ToTable(“角色”);
var userRolesTable=modelBuilder.Entity().ToTable(“UserRole”);
var userClaimsTable=modelBuilder.Entity().ToTable(“UserClaim”);
var usersTable=modelBuilder.Entity().ToTable(“用户”);
实体(生成器=>
{
Metadata.RemoveIndex(新[]{builder.Property(u=>u.NormalizedName.Metadata});
});
实体(生成器=>
{
RemoveIndex(新[]{builder.Property(u=>u.RoleId.Metadata});
});
}
但是,每当我运行迁移并更新数据库时,此索引仍会出现:
IX_UserRole_RoleId用于列RoleId
编辑:这是生成的迁移
migrationBuilder.CreateTable(
name: "UserRole",
columns: table => new
{
UserId = table.Column<string>(nullable: false),
RoleId = table.Column<string>(nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_UserRole", x => new { x.UserId, x.RoleId });
table.ForeignKey(
name: "FK_UserRole_Role_RoleId",
column: x => x.RoleId,
principalTable: "Role",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_UserRole_User_UserId",
column: x => x.UserId,
principalTable: "User",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_UserRole_RoleId",
table: "UserRole",
column: "RoleId");
migrationBuilder.CreateTable(
名称:“用户角色”,
列:表=>new
{
UserId=table.Column(可空:false),
RoleId=table.Column(可空:false)
},
约束:表=>
{
表.PrimaryKey(“PK_UserRole”,x=>new{x.UserId,x.RoleId});
表1.外键(
名称:“FK_UserRole_Role_RoleId”,
列:x=>x.RoleId,
原则性:“角色”,
主栏:“Id”,
onDelete:引用。级联);
表1.外键(
名称:“FK\U用户角色\U用户\U用户ID”,
列:x=>x.UserId,
原则性:“用户”,
主栏:“Id”,
onDelete:引用。级联);
});
migrationBuilder.CreateIndex(
名称:“IX_UserRole_RoleId”,
表:“用户角色”,
专栏:“RoleId”);
按照惯例,EF Core为每个FK列添加索引,该列不是另一个索引的前导部分。尽管您没有使用这些索引的查询,但一般来说,它们对于强制执行FK约束以及实现级联删除非常有用,因此事实上它们是关系数据库设计中的标准(类似于用于强制执行unique/PK约束等的unique索引),但这不是这里的问题
您可以将其视为缺陷,但是即使使用显式<代码> ReaveCudio 这是因为EF核心约定不是静态应用的。它们由侦听不同模型元数据更改的类实现,这些更改触发“重新应用”约定
很快,您就无法使用metadata/fluent API删除此类索引。如果您真的想删除它们(我不建议这样做),您应该手动编辑生成的迁移,并从
Up
和Down
方法中删除相应的create/drop命令。迁移是否会给您带来任何错误(是否有外键链接阻止数据正确运行?). 我的建议是备份数据库,然后为迁移生成SQL,然后手动运行。从我的package manager控制台运行时,您通常会从DBMSNo错误中获得更多信息。这是一个新的数据库,我也正在为其执行迁移。您可以发布由此更改生成的迁移吗?您好@PaulMichaels,我已经用它编辑了我的问题。