很好的问题很清楚。这是我在OnModelCreating
类中的dbContext
方法:
modelBuilder.Entity<States>(entity =>
{
entity.ToTable("States");
modelBuilder.Entity<States>()
.HasIndex(p => new { p.State })
.HasFilter("[State] IS NOT NULL")
.HasFilter("[Code] IS NOT NULL")
.IncludeProperties(p => new
{
p.Code
})
.IsUnique();
我也尝试过.IsUnique(true)
,但它不起作用。
这是正在生成的迁移代码:
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "States",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
State = table.Column<string>(maxLength: 30, nullable: true),
Code = table.Column<string>(maxLength: 3, nullable: true),
Description = table.Column<string>(nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_States", x => x.Id);
});
migrationBuilder.CreateIndex(
name: "IX_States_State",
table: "States",
column: "State",
unique: true,
filter: "[Code] IS NOT NULL")
.Annotation("SqlServer:Include", new[] { "Code" });
}
这是我正在生成的表的SQL查询:
CREATE TABLE [dbo].[States]
(
[Id] [INT] IDENTITY(1,1) NOT NULL,
[State] [NVARCHAR](30) NULL,
[Code] [NVARCHAR](3) NULL,
[Description] [NVARCHAR](MAX) NULL,
CONSTRAINT [PK_States]
PRIMARY KEY CLUSTERED ([Id] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
您可以看到这些列不是唯一的并且可以为空。
我在这里想念什么?
首先,由于您希望列和状态代码不可为空,因此需要使用注释[Required]
进行声明: