2009-07-17 2 views
1

데이터베이스를 캐시의 일종으로 사용하고 있습니다. 현재 알려진 "사실"을 저장하는 것이 목적입니다 (세부 사항은 흥미롭지 않습니다). 그러나 결정적으로 중복 된 사실을 삽입하는 것을 피하고 싶습니다. 이렇게하려면 현재 데이터 액세스 코드가 여러 위치에서 삽입 또는 무시를 사용합니다.엔티티 프레임 워크 : INSERT OR IGNORE와 같습니다.

엔티티 프레임 워크를 사용하여 관리 효율성을 얻고 싶습니다. 나는 미묘하게 다른 쿼리에 대해 또 다른 보일러 플레이트 코드를 작성 했으므로 쿼리에 대한 Entity Framework의 지원이 뛰어납니다.

그러나 사실은 새로운 사실을 추가 할 수있는 좋은 지원을 찾을 수 없습니다. 분명히 .NET에서 새 엔터티를 만들고 모델에 추가 한 다음 데이터베이스에 변경 사항을 저장하는 것입니다. 그러나 이것은 삽입이 허용되지 않는 특정 행이 이미 존재하는지 여부를 미리 확인해야한다는 것을 의미합니다. 일반적으로 추가 라운드 트립을 의미하지만 대개 훨씬 심각합니다. 이전에는이 ​​코드가 매우 유사했습니다. 데이터베이스가 무시할 수 있기 때문에 간혹 중복 삽입이 중요하지 않았지만 이제는 행이 사전에 존재하기 때문에 병렬 삽입에서 하나의 이미 존재하는 행이 전체 트랜잭션의 롤백을 야기하므로 훨씬 작은 배치 (트랜잭션 오버 헤드로 인해 일반적으로 여러 번 느려집니다)에서 그렇게해야합니다.

그래서 누구나 엔티티 프레임 워크를 사용하여 비슷한 동작을 얻는 방법을 알고 있습니까?

구체적으로 말하면, 몇 가지 삽입을 수행 할 수 있고 데이터베이스가 불가능한 삽입을 무시할 수 있기를 원합니다 - 또는 더 일반적으로 불필요한 왕복을 피하기 위해 서버 측 충돌 해결 코드를 표현할 수 있어야합니다 및 거래.

중요한 경우 SQLite를 사용하고 있습니다.

답변

1

이 기능은이를 지원하는 DB (예 : MSSQL)에서 저장 프로 시저 (엔터티 프레임 워크에서 사용할 수 있음)를 통해 구현할 수 있습니다. SQLite에서는 지원되지 않습니다.

CREATE TRIGGER IF NOT EXISTS MyIgnoreTrigger BEFORE INSERT ON TheTable 
FOR EACH ROW BEGIN 
    INSERT OR IGNORE 
     INTO TheTable (col1, col2, col3) 
     VALUES (NEW.col1, NEW.col2, NEW.col3); 
    select RAISE(IGNORE); 
END; 

가 또는 트리거가 직접 제약 조건을 확인 만 제약 인 경우 '무시'를 높이기 위해 설정 될 수있다 : 그러나 간단한 해결책, 즉 다음과 같은 트리거를 사용할뿐만 아니라, SQLite는 존재 위반했다.