CodeGo.net>创建复合键实体框架

不久,我想在表上创建保留主键的组合键,以提高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定义为Composite Key时,都会出现以下错误。

NotificationMessageDevice_Device_Target_NotificationMessageDevice_Device_Source:   :在一个从属角色和主要角色中的属性数   关系约束必须相同

我认为问题是因为NotificationMessageDevice上的导航属性无法识别Device表上的主键。 我该如何解决这个问题? 除此之外,如果您分享在Entity Framework上提高搜索性能的经验,我将感到非常高兴。 通常,每当我使用不带主键的First方法时,都会发生性能问题。

1个解决方案
76 votes

如果设备表具有复合主键,则在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; }
}
Sergey Berezovskiy answered 2019-11-19T00:09:29Z
translate from https://stackoverflow.com:/questions/14873169/creating-composite-key-entity-framework