Как автоматически генерировать идентификатор для базы данных 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; }