Эта сущность выглядит следующим образом:
Код: Выделить всё
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);
(Я пробовал только 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
Мобильная версия