sql >> データベース >  >> RDS >> Mysql

Entity Framework 5で、関係を通じて多くのことを表現するにはどうすればよいですか?

    別の名前を呼んでいるデータ型が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
    



    1. SQLServerの新しいドライバー…知っておくべきこと

    2. Jquery、PHP、Mysqlを使用したAjaxページ付け

    3. html / css / jsをmysqlに追加する最も安全な方法は何ですか?

    4. mysqlからチェックボックスに3つ以上のデータを取得する