我有一个列"名称",必须是unqiue.没有外国钥匙或类似的东西.
EF 6.1最终支持通过Annotations创建此类索引.已在SO上讨论过这个问题.但它似乎只能通过类中的注释来完成.如何仅使用Fluent API执行此操作?
像这样的东西:
public class PersonConfiguration : EntityTypeConfiguration<Person>
{
public PersonConfiguration()
{
HasKey(p => p.Id);
Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
//not possible?
Index(p => p.Name).IsUnique(); //???
}
}
Run Code Online (Sandbox Code Playgroud) .net c# entity-framework fluent-interface entity-framework-6
我使用EF 6.1.x Code First.
我已经读过EF最新版本不支持带过滤器表达式的索引.
SO上也没有解决方案:
一年后,使用Code First和DbMigrations使过滤器索引工作的工作方式是什么?
CREATE UNIQUE NONCLUSTERED INDEX [IX_DefaultLanguageApplicationId] ON [dbo].[Languages]
(
[IsDefaultLanguage] ASC,
[ApplicationId] ASC,
)
WHERE ([IsDefaultLanguage]=(1))
Run Code Online (Sandbox Code Playgroud) 在 Fluent API 中,我们可以在字段上指定索引:
var indexAttr = new IndexAttribute("IX_EmployeeNumber")
{
IsClustered = true
};
Property(c => c.EmployeeNumber)
.HasColumnAnnotation("Index", new IndexAnnotation(indexAttr ))
.HasMaxLength(8)
.IsRequired();
Run Code Online (Sandbox Code Playgroud)
之后Add-Migration
,我们会得到这样的CreateIndex
语句:
CreateIndex("dbo.Employees", "EmployeeNumber", clustered: true, name: "IX_EmployeeNumber");
Run Code Online (Sandbox Code Playgroud)
在a之后Update-Database
,我们有一个像这样的sql:
CREATE CLUSTERED INDEX [IX_EmployeeNumber] ON [dbo].[Employees]
(
[EmployeeNumber] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)
我的问题是:如何按降序创建这个索引?就像是:
CREATE CLUSTERED INDEX [IX_EmployeeNumber] ON [dbo].[Employees]
(
[EmployeeNumber] …
Run Code Online (Sandbox Code Playgroud)