Search code examples
c#.netoracle-databaseentity-frameworkora-00001

How to automatically generate identity for an Oracle database through Entity framework?


I'm using Oracle provider for Entity framework (beta), and I'm facing a problem.

Our tables have Id columns, which are set to be Identity in StoreGeneratedPattern. I thought that EF will automatically do "underlying works", such as create sequences, and get new identity for each record I add to the table. But when I run code to add a new record, such as:

var comment = new Comment
{
    ComplaintId = _currentComplaintId,
    Content = CommentContent.Text,
    CreatedBy = CurrentUser.UserID,
    CreatedDate = DateTime.Now
};

context.Comments.AddObject(comment);
context.SaveChanges();

an Exception still throws, which is

{"ORA-00001: unique constraint (ADMINMGR.CONSTRAINT_COMMENT) violated"}

(CONSTRAINT_COMMENT is the constrain requires that comment identity must be unique.

How do I solve this?

Thank you very much!


Solution

  • StoreGeneratedPattern="Identity" simply tells EF that the value will be generated DB-side on insert, and that it shouldn't supply a value in insert statements.

    You still need to create a sequence in Oracle:

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

    and a trigger to make table inserts use it:

    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;