c# - usuario - Creación de un marco de entidad clave compuesto
manejo de usuarios c# (1)
Si la tabla Dispositivo tiene una clave primaria compuesta, entonces necesita la misma clave externa compuesta en su tabla NotificationMessageDevice . ¿Cómo encontraría SQL un dispositivo sin la clave primaria completa? También debe hacer que estos campos sean parte de la clave primaria de la tabla NotificationMessageDevice . De lo contrario, no puede garantizar que la clave principal sea única:
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; }
}
En breve, quiero crear claves compuestas en mi tabla que permanezcan con la clave principal para mejorar el rendimiento de búsqueda del servidor sql. El problema de rendimiento se produce en la tabla de datos de 200k cuando busco una entidad sin clave primaria (es decir, una cadena de GUID). Suponer que tengo 3 clases
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 });
El problema es que cada vez que quiero hacer que ID, UDID, ApplicationKey y PlatformKey definan como una clave compuesta con modelBuilder, da el siguiente error.
NotificationMessageDevice_Device_Target_NotificationMessageDevice_Device_Source:: el número de propiedades en las funciones Dependiente y Principal en una restricción de relación debe ser idéntico
Creo que el problema se debe a que la propiedad de navegación en NotificationMessageDevice no puede reconocer cuál es la clave primaria en la tabla Dispositivo. ¿Como puedo resolver este problema? Además de esto, me alegrará si comparte sus experiencias mejorando el rendimiento de búsqueda en el marco de la Entidad. Por lo general, el problema de rendimiento ocurre cada vez que uso el primer método sin claves primarias.