Используйте последовательность для создания идентификатора при вставке с помощью 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);
Я получаю сообщение об ошибке, поскольку EF Core пытается вставить NULL в столбец Id, хотя он должен быть сгенерирован из последовательности базы данных. Обратите внимание, что объект и DbContext были созданы с использованием scaffold-dbcontext, и я уже пытался добавить атрибут DatabaseGenerated и HasDefaultValueSql самостоятельно.
Кроме того, я не могу использовать функцию UseSequence в ModelBuilder, поскольку в моем проекте есть несколько классов DbContext, и я получаю конфликт перегрузки между Oracle и функция Postgres.
И я не хочу вставлять вручную с помощью ExecuteSql, потому что у меня будет много объектов, которые также содержат свойства навигации, и это было бы слишком хлопотно.

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

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

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

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

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

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