2016-06-14 7 views
0

엔티티 프레임 워크 (모델 등의 데이터베이스 컨텍스트에서 dbsets)를 사용하는 .NET MVC 프로젝트에서 이와 같은 관계가 있다면..net mvc (엔터티 프레임 워크)의 특정 관계에서 계단식 삭제 이해?

class A { 
    contains a list of class C objects (one-to-many) 
} 

class B { 
contains a list of class C objects (one-to-many), often many of the 
same class C entries which class A uses aswell 
} 

class C { 
    contains class D elements 
} 

class D { } 

그래서 주요 문제는, 클래스 A는 내가 만 (다음은 cron 작업에 의해 삭제) 고정 된 시간을 위해 존재하도록되어있는 데이터로 수시로 삭제할 모델입니다 그러나 어떤 이유로 클래스 A 항목을 제거하면 클래스 C와 클래스 D 사이의 관계가 엉망이되어 데이터베이스의 클래스 C 항목에서 클래스 D 항목을 제거하는 것처럼 보입니다.

내 클래스의 항목을 삭제할 수있는 방법이 있습니까? 다른 모든 테이블을 완전히 예외없이 그대로 둡니다.

캐스케이드 삭제를 읽지 않았지만 솔직히 말해서 나는이 특정 상황에서 어떤 이상한 관계가 있는지 이해해야한다고 혼란스러워하고 내가 무엇을해야하는지 잘 모르겠습니다. 사용 중지합니다.

나는이 예제가 가능한 한 간단하게 설명하려고 노력했으면 좋겠다.

+0

EF 매핑을 수행 한 방법에 대한 자세한 정보를 게시 할 수 있습니까? –

답변

1

기본적으로 EF는 OneToManyCascadeDeleteConvention이 활성화되어 있습니다. 이 작업은 테이블 간의 외래 키에 대해 SQL 계단식 삭제를 설정하는 것과 같습니다. 기본 오브젝트가 h 제되면, 해당 오브젝트에 키순으로 설정된 모든 오브젝트도 h 제됩니다. 따라서 예에서 A을 삭제하면 컬렉션에있는 모든 C 개체도 삭제됩니다. 캐스 캐 이드 때문에 C 개체의 컬렉션에있는 D 개체 (모두 D 개체의 일대 다 모음이 포함 된 것을 의미한다고 가정한다고 가정)를 모두 삭제합니다.

그러나 외부 키 필드가 필수로 설정된 경우에만 OneToManyCascadeDeleteConvention이 적용됩니다. 아래 예제와 같이 nullable로 설정하면 규칙을 사용하지 않도록 설정해야합니다.

상기 그게되고
public class ObjectA 
{ 
    public int ObjectAId { get; set; } 
    public virtual ICollection<ObjectC> ObjectCCollection { get; set; } 
} 

public class ObjectC 
{ 
    public int? ObjectAId { get; set; } 
    public virtual ObjectA ObjectA { get; set; } 
} 

, 또한 선택적 EntityTypeConfiguration를 사용 엔티티 구성시에 ObjectCObjectA 간의 캐스케이드를 제거 할 수있다. 다음

internal class ObjectCMap : EntityTypeConfiguration<ObjectC> 
{ 
    public ObjectCMap() 
    { 
     this.HasOptional(o => o.ObjectA).WithMany(o => o.ObjectCCollection).WillCascadeOnDelete(false); 
    } 
} 

DbContext

modelBuilder.Configurations.Add(new ObjectCMap()); 

에서 모델 빌더에 등록 ObjectC에 외래 키 필드가 아닌 경우가하려고 할 때 널 (NULL) 그러나, SQL은 외래 키 오류가 발생합니다 ObjectA을 삭제하십시오.

+0

외래 키 설정 방법은 무엇입니까? 지금은 "many"모델에서 가상의 icollection 과 가상의 을 사용하고 있으며, 일대 다 관계를 생성하기 위해 엔티티 프레임 워크 자체가 외래 키 이름 (자체 외래 키 이름을 가진 열)을 명명하고 있습니다. EF가 저에게 선택한 클래스의 이름을 클래스의 변수로 선언해야합니까? – ObedMarsh

+0

그런 경우 위에서 설명한 EntityTypeConfiguration을 사용할 수 있습니다. HasOptional은 외부 키를 Null 가능하게 만듭니다. – Kevin

+0

완성도를 위해 외래 키를 유지하기 위해 모델에서 속성을 만드는 두 번째 옵션을 설명했습니다.이것은 위의 예제에서 "ObjectC"로 이어지며 규칙에 따라 속성 이름은 연결하려는 테이블의 id 필드와 동일한 이름이어야합니다 (이 경우 "ObjectA"). 속성 이름을 다르게 지정해야하는 경우 ForeignKeyAttribute를 사용하여 외부 키로 사용할 사용자 지정 속성 이름을 설정할 수 있습니다. 다음은 제가 의미하는 것을 보여주는 자료입니다 : http://tektutorialshub.com/data-annotations-foreignkey-attribute-entity-framework/ – Kevin