如何使用EF Core Oracle生成和自动增加Id

时间:2018-01-03 07:07:11

标签: c# asp.net-web-api code-first dotconnect ef-core-2.0

我使用实体框架核心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'

这样的expcetion

出了什么问题?

2 个答案:

答案 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;