Немного фона. Я использую:
- .Net Core 2.2.3
- Postgres как моя база данных
- Npgsql.EntityFramworkCore.PostgreSQL 2,20
- EntityFramwork как ORM
и я использую это простое объявление последовательности HiLo в моем контексте.
protected override void OnModelCreating(ModelBuilder modelBuilder) {
base.OnModelCreating(modelBuilder);
modelBuilder.ForNpgsqlUseSequenceHiLo();
}
Что создает мои файлы миграции следующим образом:
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateSequence(
name: "EntityFrameworkHiLoSequence",
incrementBy: 10);
migrationBuilder.CreateTable(
name: "AspNetRoles",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.SequenceHiLo),
Name = table.Column<string>(maxLength: 256, nullable: true),
NormalizedName = table.Column<string>(maxLength: 256, nullable: true),
ConcurrencyStamp = table.Column<string>(nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_AspNetRoles", x => x.Id);
});
// other tables code goes here... All key has
// .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.SequenceHiLo)
}
Все работает, но HiLo назначает странные идентификаторы (но все еще уникальные). Как странно? Позволь мне объяснить. Например:
У меня есть таблицы
- Заказы
- ТоварыЗаказ
- Роли (полностью не связанные с предыдущим).
И я делаю простое начальное число для базы данных, которая присваивает идентификаторы следующим образом:
Заказы:
OrderItem:
- 2 MyOrderItem1
- 3 MyOrderItem2
- 4 MyOrderItem3
Роль:
Похоже, он разделил HiLo для всех таблиц. Я думал, что это HiLo за столом.
Также я получаю ошибку, когда использую чистую новую миграцию и делаю:
dotnet ef database drop && dotnet ef database update
У меня ошибка (перевод на английский с польского):
42P07: relation "EntityFrameworkHiLoSequence" already exist
@ UPDATE
Благодаря @jpgrassi я нашел решение для странных идентификаторов. Я сделал название HiLo для каждой модели. Это выглядит так:
protected override void OnModelCreating(ModelBuilder modelBuilder) {
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<OrderItem>()
.Property(b => b.Id)
.ForNpgsqlUseSequenceHiLo("OrderItemsHiLo");
modelBuilder.Entity<Order>()
.Property(b => b.Id)
.ForNpgsqlUseSequenceHiLo("OrdersHiLo");
// More sequences goes below...
}
Теперь все это звучит логично. Но ... У меня новая ошибка:
42P07: relation "OrderItemsHiLo" already exist
Мой Up
раздел:
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateSequence(
name: "OrderItemsHiLo",
incrementBy: 10);
// more code...
}
И в моем разделе Down
по миграции у меня есть:
migrationBuilder.DropSequence(name: "OrderItemsHiLo");
Мой вопрос:
Почему эта ошибка выдается при чистой миграции и как от нее избавиться?