Я работаю с Entity Framework (пакет 6.2.0) Code First и пытаюсь создать уникальный индекс для двух полей, которые оба являются внешним ключом.Вместо создания 1 уникального индекса он генерирует два отдельных индекса.Ниже моих сущностей:
public class EntityA
{
// PK identity
public int Id { get; set; }
// Using unique index as alternative to Alternate key
[MaxLength(16)]
[Index(IsUnique = true)]
public string Name { get; set; }
public string Description { get; set; }
public virtual ICollection<LinkedEntities> LinkedEntities { get; set; }
}
public class EntityB
{
// PK identity
public int Id { get; set; }
// Using unique index as alternative to Alternate key
[MaxLength(16)]
[Index(IsUnique = true)]
public string Name { get; set; }
public string Description { get; set; }
public virtual ICollection<LinkedEntities> LinkedEntities { get; set; }
}
public class LinkedEntities
{
// PK identity
public int Id { get; set; }
// Using unique index on combination of A and B as alternative to Alternate key
[Index("IX_UniqueLinkedEntities", IsUnique = true, Order = 1)]
public EntityA EntityA { get; set; }
[Index("IX_UniqueLinkedEntities", IsUnique = true, Order = 2)]
public EntityB EntityB { get; set; }
}
А вот выходные данные скриптов миграции, которые генерируются для этих сущностей:
public override void Up()
{
CreateTable(
"dbo.EntityA",
c => new
{
Id = c.Int(nullable: false, identity: true),
Name = c.String(maxLength: 16),
Description = c.String(),
})
.PrimaryKey(t => t.Id)
.Index(t => t.Name, unique: true);
CreateTable(
"dbo.LinkedEntities",
c => new
{
Id = c.Int(nullable: false, identity: true),
EntityA_Id = c.Int(),
EntityB_Id = c.Int(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.EntityA", t => t.EntityA_Id)
.ForeignKey("dbo.EntityB", t => t.EntityB_Id)
.Index(t => t.EntityA_Id)
.Index(t => t.EntityB_Id);
CreateTable(
"dbo.EntityB",
c => new
{
Id = c.Int(nullable: false, identity: true),
Name = c.String(maxLength: 16),
Description = c.String(),
})
.PrimaryKey(t => t.Id)
.Index(t => t.Name, unique: true);
}
Как только скрипт миграции выполнен, я вижу 3 индекса на моих LinkedEntitiesтаблица в базе данных:
- IX_EntityA_Id (неуникальный, некластеризованный)
- IX_EntityB_Id (неуникальный, некластеризованный)
- PK_dbo.LinkedEntities (Clustered)
Почему EF не создает уникальный индекс "IX_UniqueLinkedEntities" для комбинации двух полей EntityA и EntityB?У меня такое ощущение, что это как-то связано с тем фактом, что оба поля также являются FK.
Является ли единственным способом создать мое уникальное ограничение в этом случае, чтобы сделать что-то, как предложено здесь ?Или включить в сценарий миграции необработанный SQL DDL?