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

Vim*_*987 12 .net c# oracle entity-framework ora-00001

我正在使用Oracle提供程序实体框架(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();
Run Code Online (Sandbox Code Playgroud)

一个异常仍然会抛出,这是

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

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

我该如何解决这个问题?

非常感谢你!

Kri*_*erA 16

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

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

create sequence ComplaintIdSequence minvalue 1 maxvalue 9999999 start with 1 increment by 1;
Run Code Online (Sandbox Code Playgroud)

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

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;
Run Code Online (Sandbox Code Playgroud)

  • 我没有说过Oracle应该在它的数据库中执行它,但它肯定应该在它的提供程序中执行它(注释中的"框架") (2认同)
  • 在Model-First场景中,我同意:如果表具有带有storegeneratedpattern = identity的int(或其他数字)主键,则EF /提供者将为序列+触发器生成SQL-DDL是合理的期望... (2认同)