2013-12-17 2 views
3

를 업데이트하려고 삭제 :EF 내가이 시나리오를 가정하면 외래 키

Table Bar 
Id int not null 
Name string not null 

Table Foo 
Id int not nul 
BarId int foreign key (Bar) references Id 

내가 EF가 업데이트하려고하는 이유 푸에 대한 참조가 줄을 삭제하려고

Foo가 barId를 NULL로 설정 했습니까?

누군가가 Bar에 NULL을 설정하려고 할 때 발생하는 내 속성에 대한 유효성 검사가 있으며 EF에서 Foo를 업데이트하려고 시도 할 때이 오류가 발생합니다.

내가 같은 쿼리를 실행 삭제하려고하면 "foo는 어디에서 삭제 ID = 1"내가 얻을 : 내가 EF를 사용하는 경우이 오류가 할

The DELETE statement conflicted with the REFERENCE constraint "FooFK". 
The conflict occurred in database "teste", table "dbo.Bar", column 'BarId'. 

. 이 일을 할 수있는 방법이 있습니까? EF 4.3을 사용하고 있습니다.

modelBuilder.Entity<Bar>().HasRequired(x => x.Foo).WithMany().Map(x => x.MapKey("FooId")).WillCascadeOnDelete(false); 
+0

그것은 인해 제약에 null로 BarId을 설정하려고 시도합니다. 계단식 삭제가 없으며 외래 키 열에 값이나 null이 필요합니다. 제약 조건을 게시 할 수 있습니까? – scheien

+0

하지만 내 열은 NULL을 허용하지 않습니다. –

+0

제약 조건 : ALTER TABLE [dbo]. [화물] FOR CHECK ADD CONSTRAINT [CargoRaiz_Instituicao] 외래 키 ([Instituicao_Id]) 참조 [dbo]. [Instituicao] ([Id]) –

답변

0

그것은 당신이 두 가지 방법으로 "데이터베이스에서 항목을 제거"할 수있는 일반적으로 올바른 아니에요 :

이 내지도입니다. 정확하게 말하면 다음과 같습니다.

ObjectContext.DeleteObject (엔터티)는 해당 엔터티를 컨텍스트에서 삭제 된 것으로 표시합니다. (EntityState는 이후에 삭제됩니다.) 나중에 SaveChanges를 호출하면 EF가 SQL DELETE 문을 데이터베이스로 보냅니다. 데이터베이스의 참조 제한 조건을 위반하지 않으면 엔터티가 삭제되고, 그렇지 않으면 예외가 throw됩니다.

EntityCollection.Remove (childEntity)는 parent 및 childEntity 간의 관계를 삭제됨으로 표시합니다. childEntity 자체가 데이터베이스에서 삭제되고 SaveChanges를 호출 할 때 정확하게 발생하는 것은 두 가지 사이의 관계의 종류에 따라 다릅니다.

관계가 선택적 인 경우, 즉 하위에서 부모를 참조하는 외래 키 데이터베이스가 NULL 값을 허용하면이 외부 변수는 null로 설정되고 SaveChanges를 호출하면 childEntity에 대한 NULL 값이 데이터베이스에 기록됩니다 (즉, 둘 사이의 관계가 제거됨). 이것은 SQL UPDATE 문과 함께 발생합니다. DELETE 문은 발생하지 않습니다.

관계가 필요하며 (FK가 NULL 값을 허용하지 않음) 관계가 식별되지 않으면 (즉, 외래 키가 하위 (복합) 기본 키의 일부가 아님을 의미) 자식을 다른 부모에게 보내거나 명시 적으로 삭제해야합니다 (DeleteObject를 사용하여). 이들 중 하나를 수행하지 않으면 참조 제한 조건을 위반하고 SaveChanges를 호출 할 때 EF가 예외를 던집니다. "하나 이상의 foreign-key 속성이 nullable이 아니기 때문에 관계를 변경할 수 없습니다."예외 또는 유사합니다.

관계가 식별되면 (기본 키의 일부가 NULL 일 수 없기 때문에 반드시 필요합니다) EF는 childEntity를 Deleted로 표시합니다. SaveChanges를 호출하면 SQL DELETE 문이 데이터베이스로 전송됩니다. 데이터베이스의 다른 참조 제한 조건을 위반하지 않으면 엔터티가 삭제되고, 그렇지 않으면 예외가 throw됩니다.

사실 저는 링크 된 MSDN 페이지의 Remarks 섹션에 대해 혼란스러워합니다. "관계에 참조 무결성 제약 조건이있는 경우 종속 개체에서 Remove 메서드를 호출하면 관계와 종속성이 모두 표시됩니다 삭제 대상입니다. "위의 3 가지 경우 모두 "참조 무결성 제약"이 있기 때문에 이것은 부정확하거나 심지어 나쁘게 보일 수 있지만, 마지막 경우에는 실제로 삭제됩니다.

소스 (그들은 "의존 오브젝트"하지만 이상한 용어가 될 것이다 식별 관계에 참여 객체와 의미하지 않는 한.) : http://bit.ly/1bNMyF5