Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET Core 2.2迁移生成器无法删除索引_C#_Entity Framework_Asp.net Core_.net Core_Entity Framework Core - Fatal编程技术网

C# .NET Core 2.2迁移生成器无法删除索引

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

我试图从IdentityUserRole表中名为UserRole的列中删除索引/外键

UserRole有两列。UserId和RoleId。两者都是主键

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,我已经用它编辑了我的问题。