2017-12-21 12 views
1

でナビゲーションプロパティ私は今、次の二つのクラスEFコア - インデックス

public class Tip 
{ 
    public string Home { get; set; } 
    public string Away { get; set; } 
    public string Prediction { get; set; } 
    public Tipster Tipster { get; set; } 
    ... other properties 
} 


public class Tipster 
{ 
    public int Id { get; set; } 
    public string Username { get; set; } 
    public string Platform { get; set; } 
} 

を持っているが、私はtheTipテーブルに一意のインデックスを作りたいです。 EFコアのドキュメントによると、データ注釈構文はありませんので、私は流暢なものを使用しています:

protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Tip>() 
      .HasIndex(entity => new { entity.Tipster, entity.Home, entity.Away, entity.Prediction }) 
      .HasName("IX_UniqueTip") 
      .IsUnique(); 
    } 

、私は次のエラー

Cを取得し、データベースを更新するとき:. 。> dotnet efデータベースの更新System.InvalidOperationException: エンティティタイプ 'Tip'のプロパティ 'Tipster'のプロパティを呼び出せません。これはナビゲーションプロパティとして構成されているためです。プロパティは のみスカラープロパティの構成に使用できます。

EFはインデックス内で参照プロパティを使用しているという事実が気に入らなかったようです。どうすれば修正できますか?

答えて

1

エンティティを定義した方法EFは、1-nの関係のように見えるので、参照列をtipsterテーブルに配置します。つまり、tipsterはいくつかのヒントを置くことができますが、各tipは1つのtipsterだけに配置されます。

これは、データベースレベルでインデックスを作成することはないことを意味します。列なし、キーなし - 何もありません。

この問題を解決するには、最初にインデックスで達成したいことを自分自身に尋ねることがあります。索引は、索引の列を使用してより高速に照会を作成し、全表スキャンを回避することが想定されています。

1

インデックス定義式でナビゲーションプロパティを使用することはできません。代わりに、対応するFKプロパティを使用する必要があります。

あなたの場合の問題は、モデルTipに明示的なFKプロパティがないことです。慣例により、EFコアはint? TipsterIdshadow propertyを作成します。だから、理論的には、あなたはそれにアクセスするためにEF.Propertyメソッドを使用することができるはずです。

.HasIndex(e => new { TipsterId = EF.Property<int>(e, "TipsterId"), e.Home, e.Away, e.Prediction }) 

残念ながら、これは現在(EFコア2.0.1)は動作しません。だからparams string[] propertyNamesHasIndexオーバーロードに頼らなければならない:

.HasIndex("TipsterId", nameof(Tip.Home), nameof(Tip.Away), nameof(Tip.Prediction))