Подтвердить что ты не робот

Создание структуры составных ключевых объектов

В скором времени я хочу создать составные ключи на моей таблице, оставшиеся с основным ключом, чтобы улучшить производительность поиска SQL-сервера. Проблема производительности возникает в таблице данных 200k всякий раз, когда я ищу объект без первичного ключа (т.е. Строку GUID). Предположим, что у меня есть 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. Обычно проблема с производительностью возникает, когда я использую первый метод без первичных ключей.

4b9b3361

Ответ 1

Если в таблице "Устройства" есть составной первичный ключ, вам нужен такой же составной внешний ключ в таблице 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; }
}