Создание Составного Ключа Entity Framework


вкратце, я хочу создать составные ключи на моей таблице, оставшейся с первичным ключом, чтобы улучшить производительность поиска sql server. Проблема производительности возникает в таблице данных 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: : Число свойств в зависимых и главных ролях в a ограничение отношения должно быть идентичным

Я думаю, что проблема заключается в том, что свойство навигации на NotificationMessageDevice не может распознать, что первичный ключ находится в таблице устройств. Как я могу решить эту проблему? В дополнение к этому я буду рад, если вы поделитесь своими опыт повышения производительности поиска в Entity framework. Обычно проблема производительности возникает всякий раз, когда я использую первый метод без первичных ключей.

1 56

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