C# 自动生成的备用密钥

C# 自动生成的备用密钥,c#,sql,entity-framework,.net-core,entity-framework-core,C#,Sql,Entity Framework,.net Core,Entity Framework Core,EF Core正在为以下数据模型生成备用密钥(AK_UserRoles\u UserId\u RoleId): 数据模型 公共类用户:IdentityUser { [MaxLength(50)] 公共字符串名{get;set;} [MaxLength(50)] 公共字符串LastName{get;set;} 公共虚拟ICollection用户角色{get;set;} } 公共类角色:IdentityRole { 公共字符串说明{get;set;} 公共虚拟ICollection用户组{get;s

EF Core正在为以下数据模型生成备用密钥(
AK_UserRoles\u UserId\u RoleId
):

数据模型

公共类用户:IdentityUser
{
[MaxLength(50)]
公共字符串名{get;set;}
[MaxLength(50)]
公共字符串LastName{get;set;}
公共虚拟ICollection用户角色{get;set;}
}
公共类角色:IdentityRole
{
公共字符串说明{get;set;}
公共虚拟ICollection用户组{get;set;}
}
公共类用户角色:IdentityUserRole
{
公共Guid Id{get;set;}
公共虚拟用户用户{get;set;}
公共虚拟角色{get;set;}
public int?EntityId{get;set;}
公共字符串EntityType{get;set;}
}
模型生成器

模型创建时受保护的覆盖无效(ModelBuilder)
{
基于模型创建(生成器);
builder.Entity(i=>
{
i、 ToTable(“用户”);
i、 HasKey(x=>x.Id);
i、 属性(u=>u.Id).HasDefaultValueSql(“NEWID()”);
i、 HasMany(u=>u.UserRoles)
.WithOne(ur=>ur.User)
.HasForeignKey(ur=>ur.UserId)
.IsRequired();
});
builder.Entity(i=>
{
i、 可转换(“角色”);
i、 HasKey(x=>x.Id);
i、 属性(u=>u.Id).HasDefaultValueSql(“NEWID()”);
i、 HasMany(x=>x.UserGroups);
i、 有许多
.WithOne(ur=>ur.Role)
.HasForeignKey(ur=>ur.RoleId)
.IsRequired();
});
builder.Entity(i=>
{
i、 ToTable(“用户角色”);
i、 HasKey(x=>x.Id);
i、 属性(x=>x.Id);
i、 HasIndex(x=>new{x.UserId,x.RoleId,x.EntityId,x.EntityType});
});
}
结果迁移

migrationBuilder.CreateTable(
名称:“用户角色”,
列:表=>new
{
Id=table.Column(可空:false,defaultValueSql:“NEWID()”),
EntityId=table.Column(可空:true),
EntityType=table.Column(可空:false),
RoleId=表.列(可空:false),
UserId=table.Column(可空:false)
},
约束:表=>
{
表.PrimaryKey(“PK_UserRoles”,x=>x.Id);
表.UniqueConstraint(“AK_UserRoles_UserId_RoleId”,x=>new{x.UserId,x.RoleId});
表1.外键(
名称:“FK_UserRoles_RoleId”,
列:x=>x.RoleId,
原则性:“角色”,
主栏:“Id”,
onDelete:引用。级联);
表1.外键(
名称:“FK\U用户角色\U用户\U用户ID”,
列:x=>x.UserId,
原则性:“用户”,
主栏:“Id”,
onDelete:引用。级联);
});

上面的AK_UserRoles_UserId_RoleId就是问题所在。我不希望这成为一种限制。如何调整模型以允许约定不应用唯一约束,或者如何在模型生成器中进行调整?

EF Core不会自动生成备用关键点。在这种特殊情况下,之所以生成它,是因为base
IdentityDbContext
实现(在
base.OnModelCreating(builder);
call中)将
{UserId,RoleId}
定义为
用户角色
表的主键。当您的代码将
Id
设置为主键时,EF Core不会替换旧的,而是将其转换为备用键

没有用于删除键的fluent API,因此必须直接使用可变元数据模型。最简单的方法是在定义新主键之前删除旧主键:

builder.Entity<UserRole>(i =>
{
    i.Metadata.RemoveKey(i.Metadata.FindPrimaryKey().Properties);
    // ...
});
builder.Entity(i=>
{
i、 RemoveKey(即Metadata.FindPrimaryKey().Properties);
// ...
});
    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        builder.Entity<User>(i =>
        {
            i.ToTable("Users");
            i.HasKey(x => x.Id);
            i.Property(u => u.Id).HasDefaultValueSql("NEWID()");

            i.HasMany(u => u.UserRoles)
                .WithOne(ur => ur.User)
                .HasForeignKey(ur => ur.UserId)
                .IsRequired();
        });

        builder.Entity<Role>(i =>
        {
            i.ToTable("Roles");
            i.HasKey(x => x.Id);
            i.Property(u => u.Id).HasDefaultValueSql("NEWID()");
            i.HasMany(x => x.UserGroups);

            i.HasMany<UserRole>()
                .WithOne(ur => ur.Role)
                .HasForeignKey(ur => ur.RoleId)
                .IsRequired();
        });

        builder.Entity<UserRole>(i =>
        {
            i.ToTable("UserRoles");
            i.HasKey(x => x.Id);
            i.Property(x => x.Id).HasDefaultValueSql("NEWID()");
            i.HasIndex(x => new { x.UserId, x.RoleId, x.EntityId, x.EntityType }).IsUnique();
        });

    }
 migrationBuilder.CreateTable(
            name: "UserRoles",
            columns: table => new
            {
                Id = table.Column<Guid>(nullable: false, defaultValueSql: "NEWID()"),
                EntityId = table.Column<int>(nullable: true),
                EntityType = table.Column<string>(nullable: false),
                RoleId = table.Column<Guid>(nullable: false),
                UserId = table.Column<Guid>(nullable: false)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_UserRoles", x => x.Id);
                table.UniqueConstraint("AK_UserRoles_UserId_RoleId", x => new { x.UserId, x.RoleId });
                table.ForeignKey(
                    name: "FK_UserRoles_Roles_RoleId",
                    column: x => x.RoleId,
                    principalTable: "Roles",
                    principalColumn: "Id",
                    onDelete: ReferentialAction.Cascade);
                table.ForeignKey(
                    name: "FK_UserRoles_Users_UserId",
                    column: x => x.UserId,
                    principalTable: "Users",
                    principalColumn: "Id",
                    onDelete: ReferentialAction.Cascade);
            });
builder.Entity<UserRole>(i =>
{
    i.Metadata.RemoveKey(i.Metadata.FindPrimaryKey().Properties);
    // ...
});