2010-03-19 2 views
15

Person을 삭제할 때 삭제가 계단식으로 설정되어 있으므로 SQLite DB가 설정되어 있습니다. Person (PersonID를 참조하는 모든 레코드가 삭제됨)을 수동으로 삭제하면 정상적으로 작동합니다. 내가 엔티티 프레임 워크는 사람을 삭제하는 데 사용할 때 오류가 발생합니다 :이 발생하는 이유Entity Framework 및 System.Data.SQLite를 사용하여 계단식 삭제 문제가 있습니다.

System.InvalidOperationException: The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.

내가 이해가 안 돼요. 내 트리거는 삭제하라는 메시지를 삭제하기 전에 관련된 모든 객체를 정리하도록 설정됩니다.

모델 편집기로 이동하여 관계 속성을 확인하면 OnDelete 속성에 대한 작업이 표시되지 않습니다. 왜이 설정을 DB에서 가져 와서 올바르게하지 않습니까? 이 값을 Cascade로 변경하면 모든 것이 올바르게 작동하지만 DB에서 모델을 새로 고치면 그 값이 줄어들 기 때문에이 수동 변경에 의존하지 않을 것입니다.

다음은 테이블에 대한 relivent SQL입니다.

CREATE TABLE [SomeTable] 
(
    [SomeTableID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
    [PersonID] INTEGER NOT NULL REFERENCES [Person](PersonID) ON DELETE CASCADE 
) 
CREATE TABLE [Person] 
(
    [PersonID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT 
) 

답변

24

방금이 정확한 문제를 처리했습니다. 내가 EF를 사용하여 Update model from database... 옵션을 사용했을 때 삭제시 "캐스케이드"규칙을 제대로 얻지 못했음이 밝혀졌습니다.

EF 데이터베이스 모델로 이동하여 문제의 원인이되는 연결을 클릭 한 다음 (데이터베이스 구성에 따라 End2 일 수 있음)이 Cascade으로 설정되어 있는지 확인하십시오.

+0

End1 또는 End2를 업데이트해야하는 경우 방법이 있습니까? 아니면 시행 착오일까요? –

+1

데이터베이스가 모델링 된 방식에 따라 다릅니다.만약 당신이 일대 다 관계를 가지고 있다면, 'one' 끝은'Cascade'로 설정되어야합니다. – Omar

1

나에게 버그가 발생했습니다. 캐스케이드는 DB에서 선택해야합니다. SQL Server와 함께 사용해보십시오. 거기서 작동하는 것을 볼 수 있습니다. SQLite 공급자를 작성한 사람에게이 내용을보고해야합니다.

+0

SQLite 공급자 버그가 아니라는 것을 확인할 수 있습니다. 계단식 추가는 전체 모델을 제거하고 다시 작성하지 않는 한 SQL Server의 모델에 반영되지 않습니다. 고통. – Andiih

+0

@Andiih, 처음 엔 엔티티가 추가되지 않은 경우 (아마도 잘못되었을 수도 있음). 디자이너가 사용자 정의 CSDL을 덮어 쓰지 않습니다. 그것은 실제로 기능입니다. –

+0

예, 저는 데이터베이스 설계를 엉망으로 만들었습니다. CSDL을 사용자 정의하지 않았습니다. 전체 모델을 삭제하고 다시 추가하지 않고 강제로 새로 고칠 수있는 방법이 있습니까? – Andiih

4

SQL Server에서도 동일한 문제가있었습니다. 데이터베이스에서 모드를 업데이트하려고 시도했지만 계단식 규칙을 선택하지 않았습니다. 모델이 이미 생성 된 후에 규칙이 추가되었습니다. 나는 심지어 모델에서 테이블을 삭제하고 다시 추가하려고 시도했다. 그것은 같은 결과를 가져왔다. 즉 계단식 규칙은 없었다.

그러나 정확한 테이블을 사용하여 새로운 모델을 만들었을 때 캐스케이드 규칙이 적용되었습니다. 그래서 내 해결 방법은 이전 모델을 삭제하고 같은 이름의 새 모델을 만드는 것이 었습니다.

데이터베이스 모델의 업데이트 모델에 문제가있는 것 같습니다.

+1

Sql Server와 동일한 문제가있었습니다 –

+1

동일한 문제도 확인 할 수 있습니다 – Andiih

+0

디자이너는 기존 CSDL을 덮어 쓰지 않습니다. 대개 사용자 지정 내용을 유지하려고하기 때문입니다. 이 경우에는 그렇지 않지만 일반적인 경우는 아닙니다. –

0

외래 키 속성을 사용하지 않고 탐색 속성 만 사용할 수 있습니다. 사용자 개체가 삭제 된 것으로 표시되지 않으므로 삭제 캐스케이드는 코드의 문제를 해결하지 못합니다.

관련 문제