我有数据注释:
[Required]
[MaxLength(150)]
[Index(IsUnique = true)]
public string GuidName { get; set; }
现在我们需要将其移动到Fluent API(不要问我为什么(。 我的代码:
this.Property(c => c.GuidName).IsRequired().HasMaxLength(150);
this.HasIndex(c => c.GuidName).IsUnique(true).IsClustered(false);
它会生成以下迁移:
public override void Up()
{
DropIndex("dbo.Companies", new[] { "CompanyUniqueString" });
CreateIndex("dbo.Companies", "CompanyUniqueString", unique: true);
}
public override void Down()
{
DropIndex("dbo.Companies", new[] { "CompanyUniqueString" });
CreateIndex("dbo.Companies", "CompanyUniqueString", unique: true);
}
正如我们所看到的,它执行相同的操作,并且在Up和Down中具有相同的代码。但是为什么会生成它呢?
您已经从字段中删除了Index
数据注释,这就是为什么您在Up()
方法中生成DropIndex(...)
行并在Down()
方法中生成相应的CreateIndex(...)
行的原因。同时,您已经通过Fluent API添加了索引,它为您提供了其余的索引(CreateIndex(...)
在Up()
方法中,DropIndex(...)
在Down()
中(。
因此,EF 会检测模型中的两个更改,并且不会检查 Fluent API 是否生成与删除的数据批注完全相同的索引。