0

BookCategory & 두 개의 테이블이 있습니다. 하나의 카테고리에 대해 여러 권의 책이있을 수 있습니다. 엔티티 프레임 워크를 사용하고 있습니다. 특정 BookCategory를 삭제할 때 동일한 카테고리의 모든 책을 삭제하려고합니다.엔티티 프레임 워크에서 OnDelete 캐스케이드를 설정하는 방법

OnDelete = Cascade 규칙을 어디에 설정해야할지 모르겠습니다. 다음은 제 코드입니다.

추가 정보가 필요하면 알려주십시오.

1] 내 데이터베이스 (bookCatalog.Context.cs)

namespace LearningEF 
{ 
    using System; 
    using System.Data.Entity; 
    using System.Data.Entity.Infrastructure; 

    public partial class bookCatalogEntities : DbContext 
    { 
     public bookCatalogEntities() 
      : base("name=bookCatalogEntities") 
     { 
     } 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      throw new UnintentionalCodeFirstException(); 

     } 


     public virtual DbSet<BookCategory> BookCategories { get; set; } 
     public virtual DbSet<Book> Books { get; set; } 

    } 
} 

2] 내 예약 클래스 (Book.cs)

namespace LearningEF 
{ 
    using System; 
    using System.Collections.Generic; 

    public partial class Book 
    { 
     public Book() 
     { 

     } 

     public int Id { get; set; } 
     public string Title { get; set; } 
     public decimal Price { get; set; } 
     public Nullable<int> Category { get; set; } 

     public virtual BookCategory BookCategory { get; set; } 

    } 
} 

3] 내 BookCategories 클래스 (BookCategory.cs)

namespace LearningEF 
{ 
    using System; 
    using System.Collections.Generic; 
    using System.Data.Entity; 
    using System.Data.Entity.Infrastructure; 

    public partial class BookCategory 
    { 

     public BookCategory() 
     { 
      this.Books = new HashSet<Book>(); 
     } 

     public int Id { get; set; } 
     public string Name { get; set; } 

     public virtual ICollection<Book> Books { get; set; } 

    } 
} 

4 다이어그램 XML (bookCatalog.edmx.diagram)

,
<?xml version="1.0" encoding="utf-8"?> 
<edmx:Edmx Version="3.0" xmlns:edmx="http://schemas.microsoft.com/ado/2009/11/edmx"> 
<!-- EF Designer content (DO NOT EDIT MANUALLY BELOW HERE) --> 
    <edmx:Designer xmlns="http://schemas.microsoft.com/ado/2009/11/edmx"> 
    <!-- Diagram content (shape and connector positions) --> 
    <edmx:Diagrams> 
     <Diagram DiagramId="3da0fdfb8bce456da4d1833a61ed8d58" Name="Diagram1"> 
     <EntityTypeShape EntityType="bookCatalogModel.Author" Width="1.5" PointX="0.75" PointY="1.25" IsExpanded="true" /> 
     <EntityTypeShape EntityType="bookCatalogModel.BookCategory" Width="1.5" PointX="0.75" PointY="5.25" IsExpanded="true" /> 
     <EntityTypeShape EntityType="bookCatalogModel.Book" Width="1.5" PointX="3" PointY="0.875" IsExpanded="true" /> 
     <EntityTypeShape EntityType="bookCatalogModel.sysdiagram" Width="1.5" PointX="2.75" PointY="4.75" IsExpanded="true" /> 
     <AssociationConnector Association="bookCatalogModel.FK_Books_BookCategories" ManuallyRouted="false" /> 
     <AssociationConnector Association="bookCatalogModel.BookAuthors" ManuallyRouted="false" /> 
     </Diagram> 
    </edmx:Diagrams> 
    </edmx:Designer> 
</edmx:Edmx> 

enter image description here

하지만 삭제 BookCategory는 다음과 같은 오류를 가져 오는 동안. 여기

An exception of type 'System.Data.Entity.Infrastructure.DbUpdateException' occurred in EntityFramework.dll but was not handled in user code 

Additional information: An error occurred while updating the entries. See the inner exception for details. 

카테고리를 삭제하는 내 코드입니다

BookCategory deleteBookCat = dbCatlog.BookCategories.SingleOrDefault(p => p.Id.Equals(1)); 
      dbCatlog.BookCategories.Remove(deleteBookCat); 
      dbCatlog.SaveChanges(); 
+0

모델 내부에서 설정해야합니다. 디자이너와 함께 edmx를 열고 속성 창에서 엔터티를 연결하는 선을 선택하면 변경할 OnDelete 속성이 있습니다. –

+0

예, 저도 해 보았습니다. 스크린 샷을 첨부하려고합니다.하지만 여전히 오류가 발생했습니다. – AK47

+0

EF는 현재 삭제 된 컨텍스트 내에로드 된 것들만 삭제할 것이므로 전체 데이터베이스를 지우지는 않을 것이므로 모든 것이로드되었는지 확인해야합니다. –

답변

0

내가 솔루션을 가지고 (recordToDelete는 BookCategory의 인스턴스입니다) 해결책이 아닙니다. Database OnDelete Cascade가 설정되지 않은 실수 였기 때문입니다. 일단 구성되면 EF의 Ondelete Cascade는 중요하지 않습니다.

0

난 당신이 이런 일을 할 수 있다고 생각 그것은 사실,

recordToDelete.Books.ToList().ForEach(p => db.Books.Remove(p)); 


    db.BookCategory(recordToDelete).State = EntityState.Deleted; 


    db.SaveChanges(); 
+0

나는 제안을 시도해 볼 것이지만, 이상적으로는 cascade = true로 설정할 수있는 속성이 있는지 알고 싶습니다. 나는 그물에 어딘가에 보았지만, 기억이 안납니다. 그런데 감사합니다. 4 시간 씩,이 문제를 해결하기위한 더 많은 시도가 있다면 감사 할 것입니다. – AK47

+0

외래 키의 "계단식 삭제"를 설정하고이를 엔터티 모델에 반영하십시오. 그런 다음 데이터베이스는 일부 엔티티를 삭제할 때 참조 무결성을 유지하는 데 필요한 작업을 수행합니다. – faby

+0

친구가 말하지 않았던 것을 이해합니다. – AK47