如何通过Entity框架自动为Oracle数据库生成标识?

我正在使用Oracle提供程序entity framework(beta),我遇到了一个问题。

我们的表有Id列,在StoreGeneratedPattern中设置为Identity。 我认为EF会自动执行“基础工作”,例如创建序列,并为我添加到表中的每条记录获取新标识。 但是当我运行代码来添加新记录时,例如:

var comment = new Comment { ComplaintId = _currentComplaintId, Content = CommentContent.Text, CreatedBy = CurrentUser.UserID, CreatedDate = DateTime.Now }; context.Comments.AddObject(comment); context.SaveChanges(); 

一个exception仍然会抛出,这是

{“ORA-00001:违反了唯一约束(ADMINMGR.CONSTRAINT_COMMENT)”}

(CONSTRAINT_COMMENT是约束要求注释标识必须是唯一的。

我该如何解决这个问题?

非常感谢你!

StoreGeneratedPattern =“Identity”只是告诉EF该值将在插入时生成DB端,并且它不应在insert语句中提供值。

您仍需要在Oracle中创建序列:

 create sequence ComplaintIdSequence minvalue 1 maxvalue 9999999 start with 1 increment by 1; 

以及使表插入使用它的触发器:

 create or replace trigger CommplaintIdTrigger before insert on comment for each row begin if :new.ComplaintId is null then select ComplaintIdSequence.nextval into :new.ComplaintId from dual; endif; end; 

另一种选择是:

按照Alextansc描述的方式创建序列。 创建一个使用MySequence.nextval作为主键的存储过程。

将此模型的“插入”映射到您的存储过程,它可以工作!

我使用数据库第一种方法测试了这个。

使用数据库优先映射到存储过程非常简单。 转到edmx文件,右键单击要映射到存储过程的模型。 单击“存储过程映射”。 页面底部的对话框提供了三个下拉菜单,用于将插入,更新和删除映射到存储过程。

我正在使用Oracle ODP.NET,托管驱动程序和entity framework6.我使用代码优先方法创建了我的表,但由于空主键而无法添加任何记录。

解决方案是授予我的用户:
‘创造顺序’
‘创造触发’
权限并重新创建架构。

我在包管理控制台中使用-verbose标志后意识到这一点

而不是记住所有这些SQL,你可以轻松地使用Mig#这样:

  var schema = new DbSchema(ConnectionString, DbPlatform.Oracle12c); schema.Alter(db => db.CreateTable("TableName") .WithPrimaryKeyColumn("Id", DbType.Int32).AsIdentity() ...); 

在此示例中, Id列将具有Mig#自动生成的所需触发器和序列。

Oracle 12c已经解决了它

 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int SomeNumber { get; set; }