programing

Entity 프레임워크를 통해 Oracle 데이터베이스에 대한 ID를 자동으로 생성하는 방법은 무엇입니까?

javajsp 2023. 8. 2. 08:46

Entity 프레임워크를 통해 Oracle 데이터베이스에 대한 ID를 자동으로 생성하는 방법은 무엇입니까?

Oracle Provider for Entity Framework(베타)를 사용하고 있는데 문제가 발생했습니다.

테이블에는 StoreGeneratedPattern에서 Identity로 설정된 Id 열이 있습니다.저는 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).제약 조건_COMMENT)을(를) 위반했습니다."}

CONSTRINT_COMMENT는 설명 ID가 고유해야 하는 제약 조건입니다.

어떻게 해결해야 하나요?

감사합니다!

생성된 패턴 저장="Identity"는 단순히 EF에 값이 삽입 시 DB-side로 생성되며 삽입 문에 값을 제공해서는 안 된다는 것을 알려줍니다.

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;

Oracle 12c가 해결했습니다.

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

또 다른 옵션은 다음과 같습니다.

Alextansc가 설명한 대로 시퀀스를 만듭니다.MySequence.nextval을 기본 키로 사용하는 저장 프로시저를 만듭니다.

이 모델의 '삽입'을 저장 프로시저에 매핑하면 작동합니다!

저는 이것을 데이터베이스 우선 접근법을 사용하여 테스트했습니다.

데이터베이스 우선 매핑을 저장 프로시저에 사용하는 것은 매우 간단합니다.edmx 파일로 이동하여 저장 프로시저에 매핑할 모델을 마우스 오른쪽 단추로 클릭합니다.저장 프로시저 매핑을 클릭합니다.페이지 하단의 대화상자에서는 저장 프로시저에 삽입, 업데이트 및 삭제를 매핑하기 위한 세 가지 드롭다운 메뉴를 제공합니다.

Oracle ODP를 사용하고 있습니다.NET, 관리 드라이버 및 엔티티 프레임워크 6.코드 우선 접근 방식을 사용하여 테이블을 만들었지만 null 기본 키로 인해 레코드를 추가할 수 없습니다.

솔루션은 사용자에게 다음 두 가지를 모두 부여하는 것이었습니다.
'시퀀스 생성' 및
'트리거 만들기'
사용 권한 및 스키마를 다시 만듭니다.

패키지 관리 콘솔에서 -verbose 플래그를 사용한 후 이를 알게 되었습니다.

이 SQL을 모두 기억하는 대신 다음과 같이 Mig#사용하면 쉽게 기억할 수 있습니다.

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

이 예에서,Id열에는 Mig#에서 필요한 트리거 및 시퀀스가 자동으로 생성됩니다.

언급URL : https://stackoverflow.com/questions/5227962/how-to-automatically-generate-identity-for-an-oracle-database-through-entity-fra