【发布时间】:2020-11-24 16:46:29
【问题描述】:
我有下表,我刚刚添加了装饰器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 19c 数据库的向上迁移是:
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 数据库中生成一个序列,并从next 或其他东西的默认值调用它。但事实并非如此。
我现在是否必须为每列手动创建触发器和序列?
如果是这样,那么如果我必须自己干预数据库,那么代码的意义何在。
我不确定这是否有任何影响,但我正在调整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# 方面解决此问题的指针将不胜感激。
编辑1: 在this tutorial 之后,我开始意识到模型类(表)的 Id 需要是一个 int,在 oracle 术语中它是 number(10, 0) 以便自动创建所需的序列(作为列默认调用nextVal) 在数据库端。
然而,从向上迁移来看,似乎没有任何迹象表明这个序列的创建,所以它只是让我相信这个创建发生在我知识领域之外的更深的地方。
【问题讨论】:
-
标识列既不被序列也不被触发器处理。
标签: c# oracle entity-framework-6 oracle19c