Как явно установить свойство ID в автоинкрементной таблице в EFCore - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть модель, которая имеет автоматически увеличивающееся поле идентификатора по умолчанию, как обычно. Однако я хочу заполнить базу данных исходными данными, и поскольку существуют внешние ключи, я хочу явно установить идентификаторы просеянных данных.

Моя модель

public class EntAttribute
{
    public int ID { get; set; }
    public string Title { get; set; }
}

Мой код посева:

public class Seeder
{
    private class AllAttributes
    {
        public List<EntAttribute> Attributes { get; set; }
    }

    public bool SeedData()
    {
        AllAttributes seedAttributes;
        string strSource;
        JsonSerializer JsonSer = new JsonSerializer();

        strSource = System.IO.File.ReadAllText(@"Data/SeedData/Attributes.json");
        seedAttributes = JsonConvert.DeserializeObject<AllAttributes>(strSource);

        _context.AddRange(seedAttributes.Attributes);
        _context.SaveChanges();
        return true;
    }
}

Обратите внимание, я очень плохо знаком с EFCore и C #. Вышесказанное - это то, что мне удалось собрать вместе, и, кажется, оно работает до тех пор, пока я не сохраню изменения. В этот момент я получаю:

SqlException: Невозможно вставить явное значение для столбца идентификаторов в таблице «Атрибут», когда для IDENTITY_INSERT задано значение OFF.

Теперь я достаточно умен, чтобы понять, что это потому, что я не могу явно установить поле идентификатора в таблице EntAttribute, потому что оно хочет назначить свое собственное с помощью автоинкремента. Но я не достаточно умен, чтобы знать, что с этим делать.

Любая помощь приветствуется.

РЕДАКТИРОВАТЬ: Добавление решения на основе принятого ответа ниже, потому что фактический код может помочь другим ...

Поэтому я добавил в свой класс Context следующее:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.HasSequence<int>("EntAttributeNumbering")
            .StartsAt(10);

        modelBuilder.Entity<EntAttribute>()
            .Property(i => i.ID)
            .HasDefaultValueSql("NEXT VALUE FOR EntAttributeNumbering");
    }

Это сначала обеспечивает создание последовательности (имя произвольно), а затем, во-вторых, устанавливает ее для использования в соответствующей таблице вместо автоматического приращения. Как только это было сделано, я смог получить исходные данные. Существует менее 10 записей, поэтому мне нужно было только установить начальное значение для последовательности на 10. Обычно это имеет смысл, но я знаю, что больше никогда не будет.

Мне также пришлось свергнуть мои миграции, потому что они каким-то образом попали в беспорядок, но это, вероятно, не связано.

1 Ответ

0 голосов
/ 03 сентября 2018

С помощью EF Core вы можете создать и использовать объект Sequence для назначения идентификаторов, а также можете зарезервировать диапазон идентификаторов для ручного назначения, указав, где начинается последовательность. С помощью последовательности вы можете назначить идентификаторы самостоятельно или позволить базе данных сделать это за вас.

...