0

I가 다음과 같은 모델MVC 엔티티 프레임 워크 모델 : 기본 키 2 개 이상의 키에 따라서 문제

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

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

와 내가 그들을 그렇게

public class UserAppointment 
{ 
    public int Id { get; set; } 
    public int UserId { get; set; } 
    public int AppointmentId { get; set; } 

    public virtual Appointment Appointment {get;set;} 
    public virtual User User {get;set;} 
} 
같은 별도의 기본 키와 다른 테이블에 할당 할

내가 원했던 것은 Id가 키 (고유, 자동 생성 등) 인 동시에 UserId와 AppointmentId가 고유 한 조합을 갖도록 강제하는 것입니다. 순간

eg 
this is what i want 
    Id   UserId   AppointmentId 
    1   1     2 
    2   1     3 

and not this 
    Id   UserId   AppointmentId 
    1   1     2 
    2   1     2 
    3   1     2 

나는 내 키
modelbuilder.Entity<UserApointment>() 
    .HasRequired(e => e.User) 
    .HasMany(u => u.Appointment) 
    .HasForeignKey(e => e.UserId); 

modelbuilder.Entity<UserApointment>() 
    .HasRequired(e => e.Appointment) 
    .HasMany(u => u.Users) 
    .HasForeignKey(e => e.AppointmentId); 

을 구성하는 내 상황에 일부 모델 빌더 문을했다하지만 여전히 나를 유사한 사용자와 약속 ID를 가진 레코드를 삽입하게됩니다.

이 문제를 해결하는 방법에 대한 조언은 대단히 감사하겠습니다! 감사합니다.

+0

복합 PK를 사용할 수있는 경우 왜 'UserApointment'에 대해'Id' 열을 유지하려고합니까? – Eranga

+0

UserAppointment와 일대 다 많은 관계가있는 다른 테이블에서이 테이블을 사용하고 있습니다. 나는 그것이 더 쉽게 쿼리 할 수 ​​있다고 생각하니? – gdubs

답변

1

UserAppointment 테이블에 고유 제한 조건을 작성하면 데이터베이스 레벨에서이 문제를 해결할 수 있습니다. 기본 키는 경우

: here. 더 특별히 말을 읽어

modelbuilder.Entity<UserApointment>().HasKey(x=> new { x.UserId,x.AppointmentId}); 

:

엔티티 프레임 워크 (내가 익숙하지 오전하는)에
ALTER TABLE UserAppointments 
ADD CONSTRAINT uc_UserAppointment UNIQUE (UserID,AppointmentID) 

는 다음과 같이 할 것 여러 속성으로 구성되고 속성을 포함하여 익명 형식을 지정합니다. 예를 들어,에서 C#을 t => { t.Id1, t.Id2} 아마 고유 색인이 당신의 목적을 더 나은 역할을

UPDATE 새로운 :

CREATE UNIQUE INDEX IX_UserAppointment 
ON UserAppointment (UserId, AppointmentId) 

이 독특한 인덱스를 사용하면 UserId와 AppointmentId의 중복 된 조합이 테이블에 존재하지 않으며 쿼리 속도가 빨라집니다.

+0

일부 스크립트에서는 첫 번째 옵션을 보았지만 완전히 이해하지 못했습니다. 나에게 첫번째 진짜 빠른 것을 시험해 보자. 감사! – gdubs

+0

두 번째 작품! 나는 꽤 확신한다. 어느 쪽을 추천 하시겠습니까? 어쨌든 감사합니다! 수정 : 확인하세요. 두 번째는 문제가 있었는데 ID는 기본 키 상태를 잃어 버렸습니다. 값을 생성하지 않습니다. 쾅쾅. 어쩌면, 아픈 사람 1을 사용하십시오. – gdubs

+0

그것이 효과적이기 때문에 기쁩니다. 데이터베이스에 제약 조건을 추가합니다. 이렇게하면 자신뿐만 아니라 모든 응용 프로그램에서 데이터 무결성을 유지 관리 할 수 ​​있습니다. – Icarus