2013-02-14 152 views
52

不久,我想在我的表上創建組合鍵與主鍵,以提高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 }); 

的問題是什麼,每當我想要的ID,UDID,ApplicationKey和PlatformKey定義爲複合鍵與模型構建器它提供了以下錯誤。

NotificationMessageDevice_Device_Target_NotificationMessageDevice_Device_Source: :在一個 關係約束的依賴和主要角色的屬性數必須相同

我認爲這個問題是因爲NotificationMessageDevice導航性能是無法識別Device表上的主鍵是什麼。我該如何解決這個問題?除此之外,如果您分享改善Entity框架搜索性能的經驗,我會很高興。通常,無論何時使用沒有主鍵的First方法,性能問題都會發生。

+0

我對EF開發並沒有太多的想法,但是你沒有'ForeignKeyAttribute'對錯誤的東西? – 2013-02-14 10:55:46

+1

Nop這是正確:) – kkocabiyik 2013-02-14 10:58:05

回答

73

如果設備表有複合主鍵,那麼你需要在你的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; } 
} 
+0

這是我們需要實現的所有組合鍵上定義的屬性必須在目標表上實現,只要我們使用Device對象作爲導航屬性。 – kkocabiyik 2013-02-14 11:18:50

+0

是的,這將是數據庫中的外鍵。外鍵是來自父表的主鍵,所以它應該完全相同。順便說一句,如果你想'PlatformKey'是設備PK的一部分,你還需要NotificationMessageDevice中的該字段也是 – 2013-02-14 11:20:24

+0

嗯,還有一個問題,有沒有什麼辦法在Entity Framework上創建超級密鑰呢? – kkocabiyik 2013-02-14 11:28:01