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

C# 如何使用EF Core Oracle生成和自动增加Id,c#,asp.net-web-api,code-first,dotconnect,ef-core-2.0,C#,Asp.net Web Api,Code First,Dotconnect,Ef Core 2.0,我首先使用entity framework core 2代码在Oracle 11g中生成数据,实体提供者是dotConnect,我的POCO类如下: public partial class Favoritepage { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } public int Personnelid { get; set;

我首先使用entity framework core 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; }
}
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");
        });
    }
}
我的DbContext如下所示:

public partial class Favoritepage
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public int Personnelid { get; set; }
    public int Pageid { get; set; }
}
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");
        });
    }
}
它不起作用,并且像这样提升表达式
ORA-01400无法将值NULL插入列“Id”


怎么了?

因为Oracle 11g不支持序列或函数中的列默认值,所以唯一的方法是使用触发器

创建序列S_XXX;
创建或替换触发器T_XXX
插入前
关于XXX
每行
开始

如果(:NEW.ID这样对我有效

builder.Property(e=>e.Id).HasColumnName(“Id”)
.fororacleusequencehilo(“序列名称”);

您确定需要在DBContext中使用所有这些显式值吗?它似乎与您的实体定义冗余,而且正如我正确记得的那样,很多都是自动完成的。我知道这一点,我只是不知道问题出在哪里,所以我添加了所有这些定义。如果
S\u FAVORITEPAGE.NEXTV对于
ID
列,AL
设置为
DEFAULT
。@Ivan Stoev设置
S_FAVORITEPAGE。对于
ID
列,NEXTVAL
设置为
DEFAULT
无法,可能我的方法错误。这会创建触发器吗?