У меня есть модель, которая имеет автоматически увеличивающееся поле идентификатора по умолчанию, как обычно. Однако я хочу заполнить базу данных исходными данными, и поскольку существуют внешние ключи, я хочу явно установить идентификаторы просеянных данных.
Моя модель
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. Обычно это имеет смысл, но я знаю, что больше никогда не будет.
Мне также пришлось свергнуть мои миграции, потому что они каким-то образом попали в беспорядок, но это, вероятно, не связано.