2012-04-12 3 views
13

Entity Framework 코드 우선 접근 방식을 사용합니다.계단식 삭제는 일대 다 관계에서 어떤 방향으로 진행됩니까?

가정하자 내가 두 엔티티 클래스가 : 여기에서 주목해야 할

[Table("Objects")] 
public class DbObject : IValidatableObject 
{ 
    public long Id { get; set; } 

    public string Name { get; set; } 
    public string Description { get; set; } 

    public virtual ICollection<DbObjectProperty> Properties { get; set; } 
} 

[Table("ObjectProperties")] 
public class DbObjectProperty 
{ 
    public long Id { get; set; } 

    public string Name { get; set; } 
    public string Value { get; set; } 

    [Display(Name = "Object"), UIHint("Object")] 
    public long ObjectId { get; set; } 
    public virtual DbObject Object { get; set; } 
} 

포인트 :

  • DbObject 만 탐색 속성을 가지고 있지만, 외래 키
  • DbObjectProperty에 더 열은 탐색이 없습니다 속성 은 외래 키가있는 해당 열
  • 입니다. 내가 객체를 삭제하면 그 속성도 함께 가지길 원하지만, 하나의 속성을 삭제하면 전체 객체가 사라지지 않을 것임을 분명히해야합니다.

    물론
    modelBuilder.Entity<DbObjectProperty>() 
        .HasRequired(op => op.Object) 
        .WithMany(obj => obj.Properties) 
        .HasForeignKey(op => op.ObjectId) 
        .WillCascadeOnDelete(false); 
    

    이 더 계단식 삭제가 발생하지 않습니다 의미 DB를 컨텍스트에 대한 OnModelCreating 방법에서

은, 지금까지 나는 관계를 정의하려면 다음을했다. 내 질문은 : 내가 이것을 true으로 바꾸면, 내가 원하는 것을 할 수 있을까? 객체를 삭제하면 객체의 속성을 함께 사용하고 싶지만 단일 속성을 삭제하면 객체 전체가 사라지 길 바라지 않습니다. 나는이 속성을 삭제하면 관련 개체를 삭제할 것을 암시하는 것 같다 걱정

DropForeignKey("ObjectProperties", "ObjectId", "Objects"); 
DropIndex("ObjectProperties", new[] { "ObjectId" }); 
AddForeignKey("ObjectProperties", "ObjectId", "Objects", "Id", cascadeDelete: true); 
CreateIndex("ObjectProperties", "ObjectId"); 

:

이 변경 (false에서 true에)에 대한 자동 생성 된 마이그레이션 코드는 이것이다. 그럴거야?

답변

13

데이터베이스의 관계 삭제는 주체 (주/고유 키 테이블)와이 관계의 종속 테이블 (외래 키 테이블)이 무엇인지 정의합니다.

그런 다음 주체를 삭제하면 해당 주체의 주/고유 키 값에 해당하는 외래 키 값을 가진 모든 종속 항목도 삭제됩니다. 종속에서 핵심으로가는 방향으로 계단식 삭제가 없습니다.

외래 키가있는 엔티티/테이블이므로 주체는 DbObject이고 종속은 DbObjectProperty입니다.

특히 종속 관계 (DbObjectProperty)를 삭제하고 교장 (DbObject)이 자동으로 삭제되는 경우 외부 키를 삭제하는 것이 거의 불가능합니다. 외래 키 삭제 될 주체를 참조하는 다른 종속 요소가 있으면 제약 조건이 위반됩니다.

걱정할 필요가 없습니다.

+0

[감사합니다!] – Timwi

+0

엄지 손가락 규칙은 캐스케이드 삭제로 레코드를 삭제하면 외래 키가 다른 레코드에서 분리되어 해당 종속 레코드가 삭제됩니다 너무. – orad

+0

그래서 ModelBuilder.Entity () .HasOne (c => c.Parent)와 동일하므로'modelBuilder.Entity () .HasMany (p => p.Children) .WithOne (c => c.Parent)) .WithMany (p => p.Children)'(그들은 같은 관계를 지정합니다)? –