正在创建复合密钥实体框架

本文关键字:实体 框架 密钥 复合 创建 | 更新日期: 2023-09-27 17:59:00

很快,我想在表上创建保留主键的复合键,以提高sql server搜索性能。每当我搜索一个没有主键(即GUID字符串)的实体时,200k数据表就会出现性能问题。假设我有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 });

问题是,每当我想用modelBuilder将ID、UDID、ApplicationKey和PlatformKey定义为复合密钥时,都会出现以下错误。

通知消息设备设备目标通知消息设备源::中的从属角色和主体角色中的属性数关系约束必须是相同的

我认为问题是因为NotificationMessageDevice上的导航属性无法识别Device表上的主键是什么。我该如何解决这个问题?除此之外,如果你能分享你在实体框架上提高搜索性能的经验,我会很高兴。通常,每当我使用没有主键的First方法时,就会出现性能问题。

正在创建复合密钥实体框架

如果Device表有复合主键,那么您的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; }
}