簡體   English   中英

如何在Entity Framework 5中表達“有很多通過”的關系?

[英]How do I express a “has many through” relationship in Entity Framework 5?

我試圖使用Entity Framework 5來查詢現有的MySQL數據庫。 我使用代碼優先創建一個基於代碼的模型,該模型按照MSDN上的本教程映射到現有數據庫。

我有兩個表: usersbuddies User有一個id ,一個name和一封email Buddy有一個user_id和一個buddy_id User有很多Buddies (也是Users )。 buddy_id列是返回Users表的外鍵。 因此每個User都有很多Users通過Buddies

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public IList<User> Buddies { get; set; } 
}

這是我的數據庫訪問代碼:

using (var db = new Models.fooContext())
{
    foreach (Models.user user in db.users)
    {
        var u = new User
        {
            Id      = user.id,
            Name    = user.name,
            Email   = user.email,
            Buddies = new List<User>()
        };

        // this is obviously very inefficient but I am just
        // trying to get anything to work
        foreach (Models.buddy buddy in db.buddies) // this line throws an exception
        {
            if (buddy.user_id == user.id)
            {
                var b = new User();
                // take buddy.user_id and find this user in the user table
                u.Buddies.Add(b);
            }
        }

        // serialize User and write it to a file here
    }
}

此代碼在上面指定的行上拋出以下異常:

System.Data.EntityCommandExecutionException:執行命令定義時發生錯誤。 有關詳細信息,請參閱內部異常。“

內部異常是帶有消息的MySql.Data.MySqlClient.MySqlException

已經有一個與此Connection關聯的開放DataReader,必須先關閉它。

我的問題:

  1. 如何創建一個告訴EF每個User有很多Buddies
  2. 一旦EF了解User有很多Buddies ,我如何使用buddy_id查找該BuddyUser記錄?

您有一種數據類型,您正在調用單獨的名稱。 這有點令人困惑。 但是,要首先使用代碼,您只需在Custom 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; }
}

如果你使用上面的方法,你擁有的每個用戶對象都會有一個名為Buddies的導航屬性 查詢用戶時,您需要急切加載好友用戶 ,請執行以下操作:

context.users.Include("Buddies")

此外,要解決您與多個讀者的問題。 這是因為您沒有枚舉第一個循環中的查詢 (db.users)。 要解決這個問題,您可以枚舉查詢,如下所示:

var users = context.users.Include("Buddies").ToList();
foreach(var user in users)....

如果您使用上面的配置,您不需要嘗試匹配id,您只需從用戶使用好友導航屬性 (虛擬,延遲加載)獲取好友列表(如果是新的空字段),執行:

user.Buddies

正如您所看到的,您並不需要'Model.buddy'(因為它只包含一個id映射)實體框架將負責鏈接。 但是,如果您並不總是在用戶查詢中包含好友,則可能需要該表。 將通過以下方式查詢LINQ:

var userBuddies = db.buddies.Where(buddy=>buddy.user_id == user.id).ToList();
//An enumerated list of user buddies 
//do stuff

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM