0

タイトルが示すように、Asp.net mvc 3 EF のクエリで問題が発生しました。1対多の関係を持つ2つのテーブルを取得しました。

table1 ユーザー int user_ID 文字列 ユーザー名

table2 Friends int friendsID int user_ID int friend_ID

コントローラー:

// // GET: /ユーザー/詳細/5

public ViewResult Details(int id)
    {
        User user = db.Users.Include("Friends").FirstOrDefault(u => u.user_ID == id);
        //Also for each friend get the User:
        foreach (var friend in user.Friends.ToList())
        {
            friend.User = db.Users.Find(friend.friend_ID);
        }
        return View(user);
    }

ビュー「詳細」:

@model Social2.Models.User

@{
    ViewBag.Title = "Details";
}

<h2>Details</h2>
    <div class="display-field">
        @foreach (var friend in @Model.Friends)
    {
           @friend.User.username;
    }   
    </div>

環境:

public partial class ASPNETDBEntities : DbContext
{
    public ASPNETDBEntities()
        : base("name=ASPNETDBEntities")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }

    public DbSet<aspnet_Users> aspnet_Users { get; set; }
    public DbSet<Friend> Friends { get; set; }
    public DbSet<User> Users { get; set; }
}

ユーザーモデル:

public partial class User
{
    public User()
    {
        this.Friends = new HashSet<Friend>();
    }
    [Key]
    public int user_ID { get; set; }
    public System.Guid user_UniqueID { get; set; }
    public string username { get; set; }

    public virtual aspnet_Users aspnet_Users { get; set; }
    public virtual ICollection<Friend> Friends { get; set; }
}

友人モデル

public partial class Friend
{
    public int friendship_ID { get; set; }
    public int user_fr_ID { get; set; }
    public int friend_ID { get; set; }

    public virtual User User { get; set; }
}

問題は、~/user/details/1 に移動すると、ビューに 1 つ (最後の 1 つ) の友人しか表示されないことです。すべてのユーザーについて、最後の友人が表示されます。それらをすべて表示する方法は?

4

3 に答える 3

0

問題はここにあると思います

User user = db.Users.Include("Friends").FirstOrDefault(u => u.user_ID == id);

FirstOrDefault1つのレコードのみを提供します。

于 2012-06-12T13:10:06.333 に答える
0

データベースには、次のように定義された2 つの関係が必要です。

DB スキーマ

このスキーマからエンティティ モデルを作成すると、2 つの一対多の関係も得られます。DBContext T4 テンプレートをこのモデルに適用すると、次のような POCO クラスが得られるはずです。

public partial class Users
{
    public Users()
    {
        this.Friends = new HashSet<Friends>();
        this.Friends1 = new HashSet<Friends>();
    }

    public int user_ID { get; set; }
    public string username { get; set; }

    public virtual ICollection<Friends> Friends { get; set; }
    public virtual ICollection<Friends> Friends1 { get; set; }
}

public partial class Friends
{
    public int friendship_ID { get; set; }
    public int user_fr_ID { get; set; }
    public int friend_ID { get; set; }

    public virtual Users Users { get; set; }
    public virtual Users Users1 { get; set; }
}

Users.FriendsFriends.Usersは最初の関係のペアを形成し、Users.Friends1Friends.Users1は 2 番目の関係のペアになります。(モデル デザイナーでナビゲーション プロパティの名前を変更して、名前をより意味のあるものにすることができます。) クエリは次のようになります (「第 2 レベル」を含めることができ、例のようにループは必要ありません)。

public ViewResult Details(int id)
{
    // important to use User1 in Include, not User
    User user = db.Users.Include("Friends.User1")
        .FirstOrDefault(u => u.user_ID == id);
    return View(user);
}

DbContextの強く型付けされたバージョンも使用できIncludeます。

Include(u => u.Friends.Select(f => f.User1))
于 2012-06-12T14:42:51.943 に答える
0

問題はクラス Friend のマッピングだと思います。

次のように変更してみてください:

public partial class Friend
{
    [Key]
    public int friendship_ID { get; set; }
    public int user_fr_ID { get; set; }
    public int friend_ID { get; set; }

    [ForeignKey("friend_ID")]
    public virtual User User { get; set; }
}
于 2012-06-12T13:26:54.100 に答える