我有一个通用存储库,我有一个方法可以将数据保存到数据库中。知道我正在改变一个旧系统,我遇到了这种情况:
例如,当我必须保存区域时,我需要根据数据库插入的最后一个值插入字段的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;
答案 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。
它提到了如何启用和禁用自动生成的主键。