4

그래서 Entity Framework Core에 다음 클래스가 있습니다. 코드를 처음으로 마이그레이션하려고 시도하고 있으며 내 인생에서 유창한 API를 만드는 방법을 알 수 없습니다.복합 키 EF Fluent API 사용시 코어 오류 발생

public class Participants 
{ 
    public Activity Activity { get; set; } //Class with Id and Name of Activity 
    public ApplicationUser Participant { get; set; } 

    [Key] 
    [Column(Order = 1)] 
    public int ActivityId { get; set; } 


    [Key] 
    [Column(Order = 2)] 
    public string ParticipantId { get; set; } 
} 

EF6에서는 OnModelCreating에서이를 제대로 수행 할 수있었습니다.

modelBuilder.Entity<Attendance>() 
      .HasRequired(a => a.Activity) 
      .WithMany() 
      .WillCascadeOnDelete(false); 

그러나 EF 코어의

나는 "복합 기본 키를 설정하려면. 엔티티 유형 '참가자'데이터 주석으로 정의 된 복합 기본 키가 유창 API를 사용합니다."

얻을

내가 사용 시도

modelBuilder.Entity<Participants>().HasKey(p => new {p.Activity, p.Participant}); 

하지만, 단지 사이클 또는 여러 캐스케이드 경로의 원인이 테이블에 FOREIGN KEY 제약 조건 'FK_Participants_AspNetUsers_ParticipantId'참가자 '를 소개

로 연결하는. NO DELETE NO ACTION 또는 UP UP NO NO ACTION을 지정하거나 다른 FOREIGN KEY 제약 조건을 수정하십시오.

모든 것을하기위한 더 좋은 방법이있는 경우 제안 사항이 있습니다. 만약 당신이 복수형 구독을 가지고 있다면, 나는 기본적으로 Mosh Hamedani에 의해 EF 코어에서 일하기 위해 "Full Stack Developer가 되려고"노력하고 있습니다. 이 예제는 "13-full-stack-fundamentals"폴더에 있습니다.

UPDATE : 또한

 modelBuilder.Entity<Participants>() 
      .HasOne(p => p.Activity) 
      .WithMany() 
      .OnDelete(DeleteBehavior.Cascade); 

아직도

을 가지고 노력했다. "엔티티 유형 '참가자'데이터 주석으로 정의 된 복합 기본 키를 설정하려면 복합 기본 키, 유창 API를 사용하고 있습니다."

UPDATE 2 : 로이의 제안을하려고하면이 내가 사이클 또는 여러 개의 계단식 경로를 일으킬 수 테이블 '참가자'에 FOREIGN KEY 제약 조건 'FK_Participants_AspNetUsers_ParticipantId'를 소개

납니다 것입니다. NO DELETE NO ACTION 또는 UP UP NO NO ACTION을 지정하거나 다른 FOREIGN KEY 제약 조건을 수정하십시오.

UPDATE 3 : 나는 OneDelete 중 하나를 제거 마이그레이션

에서 : ReferntialAction.Cascade 그것은했다. FK_Participants_AspNetUsers_ParticipantId 중 하나를 제거했습니다.

나는 또한 나의 OnModelCreating

 modelBuilder.Entity<Participants>() 
      .HasKey(p => new { p.ActivityId, p.ParticipantId }); 
     base.OnModelCreating(modelBuilder); 

     //Added this (Not sure if it's needed if anyone knows let me know) 
     modelBuilder.Entity<Participants>() 
      .HasOne(p => p.Activity) 
      .WithMany() 
      .OnDelete(DeleteBehavior.Cascade); 
+0

modelBuilder.Entity () .HasRequired (a => a.Activity) .WithMany() .WillCascadeOnDelete (false); ? – DevilSuichiro

+0

내가 시도한 다른 것을 보여주기 위해 업데이트되었습니다. – vgwizardx

+0

'활동'유형을 공유 할 수 있습니까? 순환 경로를 도입하지 않는다고 확신합니까? 이 경우 마이그레이션에서 아무 것도 제거하지 않아도됩니다. – Smit

답변

3

당신이 할하려고하는 것은 EFCore에 약간의 다른 활동과 참가자 사이의 관계를 만드는 것입니다이 변경되었습니다.다음과 같이

을 수행하려면, 당신은 모델 빌더에서 NavigationProperties 대신 외래 키 속성을 참조해야합니다 : 당신은 유사한 방식으로 참가자 및 ApplicationUser (참가자) 사이의 관계를 정의하는 경우 발생하는

modelBuilder.Entity<Participants>() 
     .HasKey(p => new { p.ActivityId , p.ParticipantId }); 
+0

@vgwizardx 업데이트를 이해하지 못 했으므로 변경 사항이 문제를 해결 했습니까? –

+0

네, 내가 변한 후에 일어난 일을 고쳤습니다. 마이그레이션에서 어떤 일이 발생하는지는 이중 캐스케이드 경로를 생성한다는 것입니다. 따라서 캐스케이드 경로 중 하나를 제거하여 완전히 작동하게해야합니다. – vgwizardx

+1

이 답변으로 문제가 해결되었을 수도 있지만 추론은 잘못되었습니다. 데이터 주석을 사용하는 복합 PK 정의는 EF 코어에서 허용되지 않으며 유창한 API를 사용하여 지정해야합니다. 이는 탐색이나 관계에 관계없이 적용됩니다. 위의 코드에서 탐색이 없더라도 복합 PK에 대해서는 예외가 발생합니다. – Smit