使用Entity Framework在Database中插入数据

时间:2017-10-11 20:22:51

标签: c# oracle entity-framework

我有一个通用存储库,我有一个方法可以将数据保存到数据库中。知道我正在改变一个旧系统,我遇到了这种情况:

例如,当我必须保存区域时,我需要根据数据库插入的最后一个值插入字段的Id,但出于某种原因,当我尝试保留它时,出现错误,告诉我可以& #39; t将空值插入到表的id中。

我试着这样做:

areaRepository.Save(new Area{AreaCode = 999, AreaName =  "teste"});
areaRepository.SaveAll();

保存方法是:

public void Save(T obj)
{
    ctx.Set<T>().Add(obj);
}

并且保存所有方法是

public void SaveAll()
{
    ctx.SaveChanges();
}

执行SaveAll方法后,错误上升。

{&#34; ORA-01400:无法在(\&#34; CELG \&#34;。\&#34; EPW_AREAS \&#34;。\&#34; AREA_CODE中插入null) \&#34;)\ nORA-06512:第4行&#34;}

知道我试图强制使用AREA_CODE值,为什么实体框架没有添加它并将该值视为null?

有没有办法强迫它?

有人可以提供帮助吗?

感谢您的建议。

更新

实体类:

[Table("EPW_AREAS", Schema="CELG")]
public class Area
{
    [Key]
    [Column("AREA_CODE")]
    public int AreCode { get; set; }
    [Column("AREA_NAME")]
    public string AreName { get; set; }
}

更新2

上下文

    public WsContext(string sConnectionString)
        : base(sConnectionString)
    {
    }

    public DbSet<Area> Areas { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    }

更新3

CREATE TABLE CELG.EPW_AREAS
(
  AREA_CODE  NUMBER                            NOT NULL,
  AREA_NAME    VARCHAR2(30 BYTE)
)
TABLESPACE TBS_CELG_DATA
PCTUSED    0
PCTFREE    10
INITRANS   1
MAXTRANS   255
STORAGE    (
        INITIAL          64K
        NEXT             1M
        MINEXTENTS       1
        MAXEXTENTS       UNLIMITED
        PCTINCREASE      0
        BUFFER_POOL      DEFAULT
       )
LOGGING 
NOCOMPRESS 
NOCACHE
NOPARALLEL
MONITORING;

2 个答案:

答案 0 :(得分:4)

可能会发生错误,因为Entity Framework忽略了您为AreaCode属性设置的值,因为它被设置为Key,按照惯例,EF期望此密钥由您的数据库系统自动生成。

您可以尝试按如下方式禁用它:

[Table("EPW_AREAS", Schema="CELG")]
public class Area
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    [Column("AREA_CODE")]
    public int AreCode { get; set; }
    [Column("AREA_NAME")]
    public string AreName { get; set; }
}

请确保您不要尝试多次添加相同的区号。

答案 1 :(得分:0)

请阅读this article

它提到了如何启用和禁用自动生成的主键。