Как создать уникальный индекс по комбинации двух полей FK с помощью EF 6 - PullRequest
0 голосов
/ 26 апреля 2019

Я работаю с 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...