1

EF 코드 첫 번째 일대 다 관계가 있습니다. 그것은 본질적으로 부모/자식 관계입니다. 자식이 부모 없이는 존재할 수 없기 때문입니다. EF 코드에서 관계를 처음으로 작성하는 방법

public class Parent 
{ 
    [Key] 
    public Guid Id { get; set; } 

    public virtual ICollection<Child> Children { get; set; } 

    public virtual ICollection<OtherChild> OtherChildren { get; set; } 
} 

public class Child 
{ 
    [Key] 
    public Guid Id { get; set; } 

    public virtual Parent Parent { get; set; } 
} 

그래서 나는 내가 그것에 [필수] 속성을 퍼팅 시도 그래서 아이가 부모가해야 할 수 있었는지 확실하지 않았다. 이로 인해 다음과 같은 오류가 발생했습니다.

- InnerException {"Introducing FOREIGN KEY constraint 'Child_Parent' on table 'Child' 
    may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE 
    NO ACTION, or modify other FOREIGN KEY constraints.\r\nCould not create constraint. 
    See previous errors."} 
    System.Exception {System.Data.SqlClient.SqlException} 

좋아요. 계단식 부분이 여러 개있을 수 있습니다. 잘 모르겠습니다.

부모도 다른 자식 개체를 가지고 있으며 이러한 자식 개체는 원래 자식 개체와 다 대다 관계를 공유하지만 계단식 삭제가 필요하지 않습니다.

내가 잘못하고있는 것 같아요.하지만이 일을하는 올바른 방법은 무엇입니까?

추신. 자녀에게 부모가 필요하면 외래 키를 기본 키의 일부로 만들어야합니까?

답변

2

당신은 (그것을 데이터 주석으로 불가능) 계단식 유창함 API의 관계를 삭제하지 않도록 설정할 수 있습니다 : 당신이 부모를 삭제하면

public class MyContext : DbContext 
{ 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Parent>() 
      .HasMany(p => p.Children) 
      .WithRequired(c => c.Parent) 
      .WillCascadeOnDelete(false); 
    } 
} 

당신은 당신의 코드에서뿐만 아니라 그 아이를 삭제해야합니다.

외래 키를 기본 키의 일부로 만들 필요가 없으며 그렇게 할 때 이점이 표시되지 않습니다. Guid 키는 이미 고유합니다. 데이터베이스의 외래 키 열에 대한 인덱스를 만드는 경우 성능을 쿼리하는 데 도움이됩니다.

+0

좋아요. 그런 단순한 관계로 인해 계단식 경로가 여러 개 위험 할 수 있습니다. –

+0

@ IngóVals : 잘 모르겠습니다. 코드 스 니펫과 추가 설명을 사용하여 모델을 테스트했습니다. * "부모도 다른 자식 객체를 가지고 있으며 그 자식 객체는 원래 자식 객체"*와 다 대다 관계를 공유합니다. 하지만이 계단식 삭제 예외는 전혀 발생하지 않습니다. 아마 당신이 갖고있는 것과 똑같은 관계로 모델을 만들지 않았을 것입니다. 예외의 실제 이유를 찾으려면 전체 모델 ('OtherChild'엔티티 포함)을 표시해야한다고 생각합니다. – Slauma

관련 문제