Используйте последовательность для создания идентификатора при вставке с помощью Oracle и EF Core.C#

Место общения программистов C#
Ответить
Anonymous
 Используйте последовательность для создания идентификатора при вставке с помощью Oracle и EF Core.

Сообщение Anonymous »

Сейчас я пытаюсь вставить объект в одну из моих таблиц с помощью EF Core.
Эта сущность выглядит следующим образом:

Код: Выделить всё

public partial class Foo
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public decimal Id { get; set; }

public decimal? Prop1 { get; set; }
public decimal? Prop2 { get; set; }
public string? Prop3 { get; set; }
public string? Prop4 { get; set; }

public virtual ICollection NavProps
{ get;
set; } = new List();
}
Построитель модели для этого объекта выглядит следующим образом:

Код: Выделить всё

modelBuilder.Entity(entity => {
entity.HasKey(e => e.Id).HasName("FOO_PK");

entity.ToTable("FOO");

entity.Property(e => e.Id)
.HasColumnType("NUMBER")
.HasColumnName("ID")
.HasDefaultValueSql("SELECT schema.FOO_SEQ.nextval FROM dual ");
entity.Property(e => e.Prop1).HasColumnType("NUMBER").HasColumnName("PROP1");
entity.Property(e => e.Prop2)
.HasMaxLength(64)
.IsUnicode(false)
.HasColumnName("PROP2");
entity.Property(e => e.Prop3).HasColumnType("NUMBER").HasColumnName("PROP3");
entity.Property(e => e.Prop4)
.HasMaxLength(50)
.IsUnicode(false)
.HasColumnName("PROP4");
});

modelBuilder.HasSequence("FOO_SEQ");
Теперь, когда я хочу вставить объект в базу данных, используя этот код:

Код: Выделить всё

Foo foo = new()
{
Prop1 = 1 Prop2 = 1,
Prop3 = "test",
Prop4 = "test",
};

_dbContext.Foo.Add(foo);
await _dbContext.SaveChangesAsync().ConfigureAwait(true);
Я следовал этой документации, чтобы использовать FOO_SEQ для генерации следующего идентификатора при вставке, поскольку столбец Id не генерируется автоматически: Sequences

(Я пробовал только Schema.FOO_SEQ.nextval в качестве SQL-кода внутри метода HasDefaultValueSql, но это тоже не сработало)
Однако я получаю ошибка, поскольку EF Core пытается вставить NULL в столбец Id, поэтому код из метода HasDefaultValueSql, похоже, не передается в команду PL/SQL.
Обратите внимание, что объект и DbContext были созданы с использованием scaffold-dbcontext, и я попытался добавить атрибут DatabaseGenerated и HasDefaultValueSql уже сам.
Кроме того, я не могу использовать функцию UseSequence в ModelBuilder, потому что в моем проекте есть несколько классов DbContext, и я получаю конфликт перегрузки между функцией Oracle и Postgres.
И я не хочу обрабатывать это вручную с помощью ExecuteSql, потому что у меня будет много сущностей, которые также содержат свойства навигации, и это было бы слишком хлопотно.
Согласно комментариям, я попробовал метод HasDefaultValue, но, на мой взгляд, он должен быть таким же, как атрибут в сущности, и это также не меняет проблему.
Я также нашел обходной путь и на данный момент опубликовал его в качестве ответа, но я все еще ищу ответ, который будет работать так, как описано в документации.

Подробнее здесь: https://stackoverflow.com/questions/798 ... nd-ef-core
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»