有没有办法在覆盖上下文文件夹中的OnModelCreating
函数时只指定一个索引?
我补充说:
builder.Entity<ApplicationUser>()
.HasIndex(e => e.Id);
这会将其添加为索引,但看起来其他一些属性也已成为索引。
有没有办法让它成为唯一的索引?
我想指定一个索引的原因是: 我的迁移文件是一堆dropForeignKeys,RenameTable,CreateIndex,用于我还没有触及的东西。碰巧尝试删除一个甚至不在我的表中导致我的迁移失败的索引。这就是为什么我只想指定一个索引
上下文文件: `
public class MyContext : IdentityDbContext
{
public MyContext(DbContextOptions<MyContext> options) : base(options)
{ }
// Snippet, I only added this InboxNotification so I expected to only see a create and corresponding drop table
public virtual DbSet<InboxNotification> InboxNotifications { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<ApplicationRole>()
.HasMany(e => e.Claims)
.WithOne()
.HasForeignKey(e => e.RoleId)
.IsRequired()
.OnDelete(DeleteBehavior.Cascade);
builder.Entity<ApplicationRole>()
.HasMany(e => e.Users)
.WithOne()
.HasForeignKey(e => e.RoleId)
.IsRequired()
.OnDelete(DeleteBehavior.Cascade);
builder.Entity<ApplicationUser>()
.HasMany(e => e.Claims)
.WithOne()
.HasForeignKey(e => e.UserId)
.IsRequired()
.OnDelete(DeleteBehavior.Cascade);
builder.Entity<ApplicationUser>()
.HasMany(e => e.Logins)
.WithOne()
.HasForeignKey(e => e.UserId)
.IsRequired()
.OnDelete(DeleteBehavior.Cascade);
builder.Entity<ApplicationUser>()
.HasMany(e => e.Roles)
.WithOne()
.HasForeignKey(e => e.UserId)
.IsRequired()
.OnDelete(DeleteBehavior.Cascade);
// // Maps the .NET types to our db
// builder.Entity<IdentityUser>().ToTable("AspNetUsers")
// .HasKey(x => x.Id);
// builder.Entity<IdentityRole>().ToTable("AspNetRoles")
// .HasKey(x => x.Id);
builder.Entity<IdentityUserRole<string>>().ToTable("AspNetUserRoles")
.HasKey(x => new { x.UserId, x.RoleId });
builder.Entity<IdentityUserClaim<string>>().ToTable("AspNetUserClaims")
.HasKey(x => x.Id);
builder.Entity<IdentityUserLogin<string>>().ToTable("AspNetUserLogins")
.HasKey(x => new { x.UserId, x.ProviderKey });
builder.Entity<IdentityUserToken<string>>().ToTable("AspNetUserTokens")
.HasKey(x => new { x.UserId, x.LoginProvider, x.Name });
builder.Entity<IdentityRoleClaim<string>>().ToTable("AspNetRoleClaims")
.HasKey(x => x.Id);
builder.Entity<ApplicationUserToken>().ToTable("UserTokens")
.HasKey(x => x.Id);
builder.Entity<Team>()
.HasIndex(t => new
{
t.Name,
t.LeagueId
})
.HasName("Team_Name")
.IsUnique();
builder.Entity<Club>()
.HasIndex(c => c.Name)
.IsUnique();
builder.Entity<TeamMatch>()
.HasIndex(tm => new
{
tm.Name,
tm.TeamId
})
.IsUnique();
builder.Entity<TeamMatch>()
.HasIndex(tm => new
{
tm.Slug,
tm.TeamId
})
.IsUnique();
builder.Entity<Practice>()
.HasIndex(p => new { p.Name, p.TeamId })
.IsUnique();
builder.Entity<Practice>()
.HasIndex(p => new { p.Slug, p.TeamId })
.IsUnique();
builder.Entity<SocialPlayFriend>()
.HasKey(t => new { t.PlayerId, t.SocialPlayPreferenceId });
builder.Entity<SocialPlayFriend>()
.HasOne(f => f.Preference)
.WithMany(spp => spp.Friends)
.HasForeignKey(f => f.SocialPlayPreferenceId);
builder.Entity<SocialPlayFriend>()
.HasOne(f => f.Friend)
.WithMany(p => p.Friends)
.HasForeignKey(f => f.PlayerId);
builder.Entity<SocialPlayClub>()
.HasKey(c => new { c.SocialPlayPreferenceId, c.ClubId });
builder.Entity<SocialPlayClub>()
.HasOne(f => f.Preference)
.WithMany(spp => spp.Clubs)
.HasForeignKey(f => f.SocialPlayPreferenceId);
builder.Entity<SocialPlayClub>()
.HasOne(f => f.Club)
.WithMany(c => c.SocialPlayers)
.HasForeignKey(f => f.ClubId);
}
}
`
迁移文件: `
using Microsoft.EntityFrameworkCore.Migrations;
using System;
using System.Collections.Generic;
namespace MyAPI.Migrations
{
public partial class InboxNotification : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_ApplicationUserToken_AspNetUsers_UserId",
table: "ApplicationUserToken");
migrationBuilder.DropIndex(
name: "Team_Name",
table: "Teams");
migrationBuilder.DropIndex(
name: "IX_TeamMatches_Name_TeamId",
table: "TeamMatches");
migrationBuilder.DropIndex(
name: "IX_TeamMatches_Slug_TeamId",
table: "TeamMatches");
migrationBuilder.DropIndex(
name: "IX_Practices_Name_TeamId",
table: "Practices");
migrationBuilder.DropIndex(
name: "IX_Practices_Slug_TeamId",
table: "Practices");
migrationBuilder.DropIndex(
name: "IX_Players_UserId",
table: "Players");
migrationBuilder.DropIndex(
name: "IX_Clubs_Name",
table: "Clubs");
migrationBuilder.DropIndex(
name: "UserNameIndex",
table: "AspNetUsers");
migrationBuilder.DropPrimaryKey(
name: "PK_ApplicationUserToken",
table: "ApplicationUserToken");
migrationBuilder.DropIndex(
name: "RoleNameIndex",
table: "AspNetRoles");
migrationBuilder.RenameTable(
name: "ApplicationUserToken",
newName: "UserTokens");
migrationBuilder.RenameIndex(
name: "IX_ApplicationUserToken_UserId",
table: "UserTokens",
newName: "IX_UserTokens_UserId");
migrationBuilder.AddColumn<string>(
name: "Discriminator",
table: "AspNetRoles",
type: "nvarchar(max)",
nullable: false,
defaultValue: "");
migrationBuilder.AddPrimaryKey(
name: "PK_UserTokens",
table: "UserTokens",
column: "Id");
migrationBuilder.CreateTable(
name: "InboxNotifications",
columns: table => new
{
Id = table.Column<string>(type: "nvarchar(450)", nullable: false),
Created = table.Column<DateTime>(type: "datetime2", nullable: false),
CreatedBy = table.Column<string>(type: "nvarchar(max)", nullable: true),
DataId = table.Column<string>(type: "nvarchar(max)", nullable: true),
EventIdent = table.Column<string>(type: "nvarchar(max)", nullable: true),
Message = table.Column<string>(type: "nvarchar(max)", nullable: true),
Status = table.Column<int>(type: "int", nullable: false),
TeamIdent = table.Column<string>(type: "nvarchar(max)", nullable: true),
Title = table.Column<string>(type: "nvarchar(max)", nullable: true),
Type = table.Column<int>(type: "int", nullable: false),
UserId = table.Column<string>(type: "nvarchar(max)", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_InboxNotifications", x => x.Id);
});
migrationBuilder.CreateIndex(
name: "Team_Name",
table: "Teams",
columns: new[] { "Name", "LeagueId" },
unique: true,
filter: "[Name] IS NOT NULL AND [LeagueId] IS NOT NULL");
migrationBuilder.CreateIndex(
name: "IX_TeamMatches_Name_TeamId",
table: "TeamMatches",
columns: new[] { "Name", "TeamId" },
unique: true,
filter: "[Name] IS NOT NULL AND [TeamId] IS NOT NULL");
migrationBuilder.CreateIndex(
name: "IX_TeamMatches_Slug_TeamId",
table: "TeamMatches",
columns: new[] { "Slug", "TeamId" },
unique: true,
filter: "[Slug] IS NOT NULL AND [TeamId] IS NOT NULL");
migrationBuilder.CreateIndex(
name: "IX_Practices_Name_TeamId",
table: "Practices",
columns: new[] { "Name", "TeamId" },
unique: true,
filter: "[Name] IS NOT NULL AND [TeamId] IS NOT NULL");
migrationBuilder.CreateIndex(
name: "IX_Practices_Slug_TeamId",
table: "Practices",
columns: new[] { "Slug", "TeamId" },
unique: true,
filter: "[Slug] IS NOT NULL AND [TeamId] IS NOT NULL");
migrationBuilder.CreateIndex(
name: "IX_Players_UserId",
table: "Players",
column: "UserId",
unique: true,
filter: "[UserId] IS NOT NULL");
migrationBuilder.CreateIndex(
name: "IX_Clubs_Name",
table: "Clubs",
column: "Name",
unique: true,
filter: "[Name] IS NOT NULL");
migrationBuilder.CreateIndex(
name: "UserNameIndex",
table: "AspNetUsers",
column: "NormalizedUserName",
unique: true,
filter: "[NormalizedUserName] IS NOT NULL");
migrationBuilder.CreateIndex(
name: "RoleNameIndex",
table: "AspNetRoles",
column: "NormalizedName",
unique: true,
filter: "[NormalizedName] IS NOT NULL");
migrationBuilder.AddForeignKey(
name: "FK_AspNetUserTokens_AspNetUsers_UserId",
table: "AspNetUserTokens",
column: "UserId",
principalTable: "AspNetUsers",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
migrationBuilder.AddForeignKey(
name: "FK_UserTokens_AspNetUsers_UserId",
table: "UserTokens",
column: "UserId",
principalTable: "AspNetUsers",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_AspNetUserTokens_AspNetUsers_UserId",
table: "AspNetUserTokens");
migrationBuilder.DropForeignKey(
name: "FK_UserTokens_AspNetUsers_UserId",
table: "UserTokens");
migrationBuilder.DropTable(
name: "InboxNotifications");
migrationBuilder.DropPrimaryKey(
name: "PK_UserTokens",
table: "UserTokens");
migrationBuilder.DropIndex(
name: "Team_Name",
table: "Teams");
migrationBuilder.DropIndex(
name: "IX_TeamMatches_Name_TeamId",
table: "TeamMatches");
migrationBuilder.DropIndex(
name: "IX_TeamMatches_Slug_TeamId",
table: "TeamMatches");
migrationBuilder.DropIndex(
name: "IX_Practices_Name_TeamId",
table: "Practices");
migrationBuilder.DropIndex(
name: "IX_Practices_Slug_TeamId",
table: "Practices");
migrationBuilder.DropIndex(
name: "IX_Players_UserId",
table: "Players");
migrationBuilder.DropIndex(
name: "IX_Clubs_Name",
table: "Clubs");
migrationBuilder.DropIndex(
name: "UserNameIndex",
table: "AspNetUsers");
migrationBuilder.DropIndex(
name: "RoleNameIndex",
table: "AspNetRoles");
migrationBuilder.DropColumn(
name: "Discriminator",
table: "AspNetRoles");
migrationBuilder.RenameTable(
name: "UserTokens",
newName: "ApplicationUserToken");
migrationBuilder.RenameIndex(
name: "IX_UserTokens_UserId",
table: "ApplicationUserToken",
newName: "IX_ApplicationUserToken_UserId");
migrationBuilder.AddPrimaryKey(
name: "PK_ApplicationUserToken",
table: "ApplicationUserToken",
column: "Id");
migrationBuilder.CreateIndex(
name: "Team_Name",
table: "Teams",
columns: new[] { "Name", "LeagueId" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_TeamMatches_Name_TeamId",
table: "TeamMatches",
columns: new[] { "Name", "TeamId" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_TeamMatches_Slug_TeamId",
table: "TeamMatches",
columns: new[] { "Slug", "TeamId" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_Practices_Name_TeamId",
table: "Practices",
columns: new[] { "Name", "TeamId" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_Practices_Slug_TeamId",
table: "Practices",
columns: new[] { "Slug", "TeamId" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_Players_UserId",
table: "Players",
column: "UserId",
unique: true);
migrationBuilder.CreateIndex(
name: "IX_Clubs_Name",
table: "Clubs",
column: "Name",
unique: true);
migrationBuilder.CreateIndex(
name: "UserNameIndex",
table: "AspNetUsers",
column: "NormalizedUserName",
unique: true);
migrationBuilder.CreateIndex(
name: "RoleNameIndex",
table: "AspNetRoles",
column: "NormalizedName",
unique: true);
migrationBuilder.AddForeignKey(
name: "FK_ApplicationUserToken_AspNetUsers_UserId",
table: "ApplicationUserToken",
column: "UserId",
principalTable: "AspNetUsers",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
}
}
}
`