Tworzenie Struktury Podmiotu Klucza Kompozytowego

Wkrótce chcę utworzyć klucze kompozytowe na mojej tabeli pozostające z kluczem podstawowym w celu poprawy wydajności wyszukiwania sql server. Problem z wydajnością występuje w tabeli danych 200k za każdym razem, gdy przeszukuję obiekt bez klucza głównego (tj. ciąg GUID). Załóżmy, że mam 3 klasy

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 });

Problem polega na tym, że gdy chcę, aby ID, UDID, ApplicationKey i PlatformKey zdefiniowały jako klucz złożony z modelbuildera, daje to następujący błąd.

NotificationMessageDevice_Device_target_notificationmessagedevice_device_source: : Liczba nieruchomości w roli zależnej i głównej w ograniczenie relacji musi być identyczne

Myślę, że problem polega na tym, że właściwość nawigacji w NotificationMessageDevice nie jest w stanie rozpoznać, jaki klucz podstawowy znajduje się w tabeli urządzeń. Jak mogę rozwiązać ten problem? Oprócz tego będę zadowolony, jeśli podzielisz się swoimi doświadczeniami poprawiającymi wydajność wyszukiwania na temat struktury podmiotu. Zazwyczaj problem z wydajnością występuje zawsze, gdy używam pierwszej metody bez kluczy głównych.

Author: kkocabiyik, 2013-02-14

1 answers

Jeśli Devicetable posiada złożony klucz podstawowy, to w tabeli NotificationMessageDevice potrzebny jest ten sam złożony klucz obcy. Jak SQL znajdzie urządzenie bez pełnego klucza podstawowego? Należy również uczynić te pola częścią klucza głównego tabeli NotificationMessageDevice . W przeciwnym razie nie możesz zagwarantować, że klucz podstawowy będzie unikalny:

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; }
}
 76
Author: Sergey Berezovskiy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-14 11:15:33