Как автоматически сгенерировать идентичность для базы данных Oracle через Entity Framework? - PullRequest
12 голосов
/ 08 марта 2011

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

В наших таблицах есть столбцы 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();

, по-прежнему генерируется исключение, которое равно

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

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

Как мне решить эту проблему?

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

Ответы [ 5 ]

16 голосов
/ 08 марта 2011

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

Вам все еще нужно создать последовательность в 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;
0 голосов
/ 04 февраля 2017

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

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int SomeNumber { get; set; }
0 голосов
/ 23 декабря 2015

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

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

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

0 голосов
/ 22 октября 2015

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

Решение было предоставить моему пользователю оба:
'СОЗДАТЬ ПОСЛЕДОВАТЕЛЬНОСТЬ' и
'CREATE TRIGGER' Разрешения
и заново создайте схему.

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

0 голосов
/ 20 февраля 2014

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

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

Сопоставьте 'insert' для этой модели с вашей хранимой процедурой, и она работает!

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

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

...