创build复合关键entity framework

不久之后,我想在我的表上创build复合键,并保留主键,以提高sql server的search性能。 每当我search一个没有主键的实体(即一串GUID)时,性能问题就出现在200k数据表上。 假设我有三个class

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 :::关系约束中的从属angular色和主angular色的属性数量必须相同

我认为这个问题是因为NotificationMessageDevice上的导航属性无法识别Device表上的主键。 我该如何解决这个问题? 除此之外,如果您分享提高Entity框架search性能的体验,我将很高兴。 通常情况下,只要我使用没有主键的First方法就会出现性能问题。

如果Device表具有复合主键,那么您需要在NotificationMessageDevice表上使用相同的复合外键。 SQL如何find没有完整主键的设备? 你也应该使这些字段成为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; } }