別の名前を呼んでいるデータ型が1つあります。それは少し紛らわしいです。ただし、これを最初にコードで機能させるには、カスタムDbContextクラスで次の流暢な構成が必要です。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<user>().
HasMany(c => c.Buddies).
WithMany().
Map(
m =>
{
m.MapLeftKey("user_id");
m.MapRightKey("buddy_id");
m.ToTable("buddies");
});
}
これは、ユーザークラスが次のようになっていることを前提としています:
[Table("user")]
public class user
{
public int id { get; set; }
public string name { get; set; }
public string email { get; set; }
public virtual List<user> Buddies { get; set; }
}
上記のメソッドを使用する場合、所有するすべてのユーザーオブジェクトにはナビゲーションプロパティがあります。 その上に仲間と呼ばれます。ユーザーを照会するときは、バディユーザーを熱心にロードする必要があります。 、実行:
context.users.Include("Buddies")
さらに、複数のリーダーに関する問題に対処するため。 クエリを列挙していないためです (db.users)最初のループから。次のようにクエリを列挙できることに対処するには:
var users = context.users.Include("Buddies").ToList();
foreach(var user in users)....
また、上記の構成を使用する場合は、IDを一致させる必要はありません。バディのナビゲーションプロパティを使用して、ユーザーからバディのリスト(新規の場合はnullフィールド)を取得するだけです。 (仮想、遅延読み込み)、実行:
user.Buddies
ご覧のとおり、「Model.buddy」は実際には必要ありません(IDマッピングのみが含まれているため)EntityFrameworkがリンクを処理します。ただし、ユーザークエリに常にBuddiesを含めるとは限らない場合は、テーブルが必要になることがあります。これは、次の方法でLINQでクエリされます。
var userBuddies = db.buddies.Where(buddy=>buddy.user_id == user.id).ToList();
//An enumerated list of user buddies
//do stuff