У меня есть следующая таблица, в которой я только что добавил декоратор DatabaseGenerated
вот так:
public class Reference
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public decimal ReferenceId { get; set; }
public string AddressType { get; set; }
public string RefferenceType { get; set; }
public string RefferenceValue { get; set; }
[ForeignKey("Shipment")]
public decimal? TrackingNumber { get; set; }
public Shipment Shipment { get; set; }
}
И моя последняя миграция, перенесенная в oracle 19 c DB:
public override void Up()
{
DropPrimaryKey("SALOGSEARCH.References");
AlterColumn("SALOGSEARCH.References", "ReferenceId", c => c.Decimal(nullable: false, precision: 20, scale: 0, identity: true));
AddPrimaryKey("SALOGSEARCH.References", "ReferenceId");
}
Тем не менее, когда я выполняю свое сохранение контекста после добавления:
using (var context = new DbContext())
{
context.Reference.Add(shipperReference);
context.SaveChanges();
}
, я получаю исключение
ORA-01400: невозможно вставить NULL
Я предположил, что тег DatabaseGeneratedOption.Identity
сгенерирует последовательность в базе данных Oracle и вызовет ее из значения по умолчанию на следующем или что-то в этом роде. Но это не так.
Должен ли я теперь вручную создавать триггер и последовательность для каждого столбца?
Если да, то в чем смысл кода, если мне придется вмешиваться с самой базой данных.
Я не уверен, имеет ли это какой-либо эффект, но я настраиваю OnModelCreating
примерно так:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("SALOGSEARCH");
modelBuilder.Properties<string>().Configure(s => s.HasMaxLength(400).HasColumnType("Varchar2"));
modelBuilder.Properties<decimal>().Configure(s => s.HasPrecision(20, 0).HasColumnType("Number"));
}
Любые указатели для решения этой проблемы из c# сторона будет очень признательна.
EDIT1: Следуя этому руководству , я понял, что идентификатор класса модели (таблица) должен быть int, который равен числу (10, 0) в oracle условиях, чтобы автоматически создать желаемую последовательность (как столбец по умолчанию, вызывающий nextVal) на стороне БД.
Однако, глядя на миграцию вверх, похоже, нет никаких указаний создания этой последовательности, так что это просто наводит меня на мысль, что создание происходит где-то глубже и за пределами моей области знаний.