![](/img/trans.png)
[英]How do I simplify the access of a has-many relationship with the entity framework?
[英]How do I express a “has many through” relationship in Entity Framework 5?
我試圖使用Entity Framework 5來查詢現有的MySQL數據庫。 我使用代碼優先創建一個基於代碼的模型,該模型按照MSDN上的本教程映射到現有數據庫。
我有兩個表: users
和buddies
。 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,必須先關閉它。
我的問題:
User
有很多Buddies
? User
有很多Buddies
,我如何使用buddy_id
查找該Buddy
的User
記錄? 您有一種數據類型,您正在調用單獨的名稱。 這有點令人困惑。 但是,要首先使用代碼,您只需在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.