program tip

복합 키 Entity Framework 만들기

radiobox 2020. 12. 31. 08:08
반응형

복합 키 Entity Framework 만들기


곧 SQL Server 검색 성능을 향상시키기 위해 기본 키와 함께 남은 테이블에 복합 키를 만들고 싶습니다. 기본 키 (즉, GUID 문자열)가없는 항목을 검색 할 때마다 200k 데이터 테이블에서 성능 문제가 발생합니다. 3 개의 수업이 있다고 가정합니다.

public class Device{

    public int ID { get; set; } 
    public string UDID { get; set; }
    public string ApplicationKey { get; set; }
    public string PlatformKey { get; set; }

    public ICollection<NotificationMessageDevice> DeviceMessages { get; set; } 
}

public class NotificationMessageDevice { 

    [Column(Order = 0), Key, ForeignKey("NotificationMessage")]
    public int NotificationMessage_ID { get; set; }

    [Column(Order = 1), Key, ForeignKey("Device")]
    public int Device_ID { get; set; }

    public virtual Device Device { get; set; }
    public virtual NotificationMessage NotificationMessage { get; set; }
}

public class NotificationMessage { 

    public int ID { get; set; }
    public string Text { get; set; }
    public DateTime CreateDate { get; set; }
}

        modelBuilder.Entity<Device>().HasKey(t => new { t.ID, t.ApplicationKey, t.PlatformKey, t.UDID });

문제는 ID, UDID, ApplicationKey 및 PlatformKey를 modelBuilder와 함께 복합 키로 정의하려고 할 때마다 다음 오류가 발생한다는 것입니다.

NotificationMessageDevice_Device_Target_NotificationMessageDevice_Device_Source : : 관계 제약 조건에서 종속 역할과 주 역할의 속성 수가 동일해야합니다.

문제는 NotificationMessageDevice의 탐색 속성이 Device 테이블의 기본 키를 인식 할 수 없기 때문이라고 생각합니다. 이 문제를 어떻게 해결할 수 있습니까? 이 외에도 Entity 프레임 워크에서 검색 성능을 개선 한 경험을 공유해 주시면 기쁩니다. 일반적으로 기본 키없이 First 메서드를 사용할 때마다 성능 문제가 발생합니다.


Device 테이블에 복합 기본 키가있는 경우 NotificationMessageDevice 테이블 에 동일한 복합 외래 키가 필요 합니다. SQL은 전체 기본 키가없는 장치를 어떻게 찾을 수 있습니까? 또한 이러한 필드를 NotificationMessageDevice 테이블 기본 키의 일부로 만들어야 합니다. 그렇지 않으면 기본 키가 고유하다는 것을 보장 할 수 없습니다.

public class NotificationMessageDevice
{
    [Column(Order = 0), Key, ForeignKey("NotificationMessage")]
    public int NotificationMessage_ID { get; set; }

    [Column(Order = 1), Key, ForeignKey("Device")]
    public int Device_ID { get; set; }
    [Column(Order = 2), Key, ForeignKey("Device")]
    public string Device_UDID { get; set; }
    [Column(Order = 3), Key, ForeignKey("Device")]
    public string Device_ApplicationKey { get; set; }

    public virtual Device Device { get; set; }
    public virtual NotificationMessage NotificationMessage { get; set; }
}

ReferenceURL : https://stackoverflow.com/questions/14873169/creating-composite-key-entity-framework

반응형