我使用实体框架核心2代码首先在Oracle 11g中生成数据,实体提供者是dotConnect,我的POCO类如下:
public partial class Favoritepage
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public int Personnelid { get; set; }
public int Pageid { get; set; }
}
我的DbContext如下:
public partial class ModelContext : DbContext
{
public virtual DbSet<Favoritepage> Favoritepage { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.HasSequence<int>("S_FAVORITEPAGE", "SECURITY")
.StartsAt(1)
.IncrementsBy(20);
modelBuilder.Entity<Favoritepage>(entity =>
{
entity.ToTable("FAVORITEPAGE", "SECURITY");
entity.HasIndex(e => e.Id)
.HasName("PK_FAVORITEPAGE")
.IsUnique();
entity.Property(e => e.Id).HasColumnName("ID").ForOracleHasDefaultValueSql("S_FAVORITEPAGE.NEXTVAL");
});
}
}
当我插入这样的实体时:
static void Main(string[] args)
{
using (var dbContxt = new ModelContext())
{
var favo = new Favoritepage()
{
Pageid = 11253,
Personnelid = 14313,
};
dbContxt.Favoritepage.Add(favo);
dbContxt.SaveChanges();
Console.ReadLine();
}
}
它不起作用,并提出像ORA-01400 Cannot insert the value NULL into column 'Id'
出了什么问题?
答案 0 :(得分:1)
这样对我有用。
builder.Property(e => e.Id).HasColumnName("ID")
.ForOracleUseSequenceHiLo("SEQUENCE_NAME");
答案 1 :(得分:0)
因为Oracle 11g不支持序列或函数中的列默认值,所以唯一的方法是使用触发器。
Create Sequence S_XXX;
CREATE OR REPLACE TRIGGER T_XXX
BEFORE INSERT
ON XXX
FOR EACH ROW
BEGIN
IF (:NEW.ID <= 0) THEN
SELECT S_XXX.NEXTVAL INTO :NEW.ID FROM DUAL;
END IF;
END T_XXX;