web-dev-qa-db-fra.com

Création d'un cadre d'entité clé composite

Bientôt, je veux créer des clés composites sur ma table en conservant la clé primaire afin d’améliorer les performances de recherche du serveur SQL. Le problème de performances se produit sur la table de données 200k chaque fois que je recherche une entité sans clé primaire (c'est-à-dire une chaîne de GUID). Suppose que j'ai 3 cours

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

Le problème est que chaque fois que je veux faire en sorte que ID, UDID, ApplicationKey et PlatformKey soient définis en tant que clé composite avec modelBuilder, l'erreur suivante apparaît.

NotificationMessageDevice_Device_Target_NotificationMessageDevice_Device_Source:: Le nombre de propriétés dans les rôles Dépendant et Principal dans une contrainte de relation doit être identique.

Je pense que le problème vient du fait que la propriété de navigation sur NotificationMessageDevice n'est pas capable de reconnaître la clé primaire de la table Device. Comment puis-je résoudre ce problème? En plus de cela, je serais heureux si vous partagez vos expériences en améliorant les performances de recherche sur la structure Entity. Habituellement, le problème de performances se produit chaque fois que j'utilise la méthode First sans clé primaire.

56
kkocabiyik

Si la table Device a une clé primaire composite, vous avez besoin de la même clé étrangère composite sur votre table NotificationMessageDevice. Comment SQL trouverait-il Device sans clé primaire complète? Vous devez également faire en sorte que ces champs fassent partie de NotificationMessageDevice clé primaire de la table. Sinon, vous ne pouvez pas garantir que la clé primaire sera unique:

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
Sergey Berezovskiy