Как автоматически генерировать идентификатор для базы данных Oracle через инфраструктуру Entity?

Я использую Oracle для платформы Entity (бета), и у меня возникла проблема.

В наших таблицах есть столбцы Id, для которых установлено значение Identity в StoreGeneratedPattern. Я думал, что EF автоматически выполнит "базовые работы", например, создаст последовательности и получит новую идентификацию для каждой записи, которую я добавляю в таблицу. Но когда я запускаю код для добавления новой записи, например:

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

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

Исключение все еще бросает, что

{ "ORA-00001: уникальное ограничение (ADMINMGR.CONSTRAINT_COMMENT) нарушены" }

(CONSTRAINT_COMMENT - это ограничение, чтобы идентификатор комментария должен быть уникальным.

Как это решить?

Большое спасибо!

Ответ 1

StoreGeneratedPattern = "Identity" просто сообщает EF, что значение будет генерироваться на стороне БД на вставке и что оно не должно указывать значение в инструкциях вставки.

Вам все равно нужно создать последовательность в 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;

Ответ 2

Другой вариант:

Создайте последовательность, описанную Alextansc. Создайте хранимую процедуру, которая использует MySequence.nextval в качестве первичного ключа.

Отметьте "вставьте" эту модель в свою хранимую процедуру, и она работает!

Я тестировал это с использованием первого подхода к базе данных.

Использование первого сопоставления базы данных в хранимой процедуре довольно просто. Перейдите в файл edmx и щелкните правой кнопкой мыши модель, которую вы хотите сопоставить с хранимой процедурой. Нажмите "Хранилища хранимых процедур". В диалоговом окне внизу страницы вы увидите три раскрывающихся меню для отображения вставки, обновления и удаления в хранимые процедуры.

Ответ 3

Я использую Oracle ODP.NET, управляемый драйвер и Entity Framework 6. Я создал свои таблицы с использованием подхода, основанного на кодах, но не смог добавить никаких записей из-за нулевого первичного ключа.

Решение заключалось в том, чтобы предоставить моему пользователю оба:
" CREATE SEQUENCE" и
CREATE TRIGGER
и заново создайте схему.

Я понял это после использования флага -verbose в консоли управления пакетами

Ответ 4

Вместо того, чтобы запомнить весь этот SQL, вы можете легко сделать, используя Mig # следующим образом:

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

В этом примере столбец Id будет иметь необходимый триггер и последовательность, сгенерированные Mig # автоматически.

Ответ 5

Oracle 12c разрешил его

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