web-dev-qa-db-ja.com

複合キーエンティティフレームワークの作成

すぐに、SQLサーバーの検索パフォーマンスを向上させるために、主キーを残したままテーブルに複合キーを作成したいと思います。主キーのないエンティティ(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フレームワークでの検索パフォーマンスを改善した経験を共有していただければ嬉しいです。通常、主キーなしで最初の方法を使用するたびにパフォーマンスの問題が発生します。

56
kkocabiyik

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; }
}
76