Fra*_*ank 2 c# mysql entity-framework entity-framework-5
我试图使用Entity Framework 5来查询现有的MySQL数据库.我使用代码优先创建一个基于代码的模型,该模型按照MSDN上的本教程映射到现有数据库.
我有两张桌子:users和buddies.A User有a id,a name和an email.A Buddy有a user_id和a buddy_id.A 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; }
}
Run Code Online (Sandbox Code Playgroud)
这是我的数据库访问代码:
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
}
}
Run Code Online (Sandbox Code Playgroud)
此代码在上面指定的行上抛出以下异常:
System.Data.EntityCommandExecutionException:执行命令定义时发生错误.有关详细信息,请参阅内部异常."
内部异常是MySql.Data.MySqlClient.MySqlException带有消息的
已经有一个与此Connection关联的开放DataReader,必须先关闭它.
我的问题:
User都有很多的关系Buddies?User有很多Buddies,我如何使用它buddy_id来找到该User记录Buddy?cal*_*oyd 11
您有一种数据类型,您正在调用单独的名称.这有点令人困惑.但是,要首先使用代码,您只需在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");
});
}
Run Code Online (Sandbox Code Playgroud)
假设您的用户类如下所示:
[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; }
}
Run Code Online (Sandbox Code Playgroud)
如果你使用上面的方法,你拥有的每个用户对象都会有一个名为Buddies 的导航属性.查询用户时,您需要急切加载好友用户,请执行以下操作:
context.users.Include("Buddies")
Run Code Online (Sandbox Code Playgroud)
此外,为了解决您的问题与多个读者.这是因为您没有枚举第一个循环中的查询(db.users).要解决这个问题,您可以枚举查询,如下所示:
var users = context.users.Include("Buddies").ToList();
foreach(var user in users)....
Run Code Online (Sandbox Code Playgroud)
如果您使用上面的配置,您不需要尝试匹配id,您只需从用户使用好友导航属性(虚拟,延迟加载)获取好友列表(如果是新的空字段),执行:
user.Buddies
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,您并不需要'Model.buddy'(因为它只包含一个id映射)实体框架将负责链接.但是,如果您并不总是在用户查询中包含好友,则可能需要该表.将通过以下方式查询LINQ:
var userBuddies = db.buddies.Where(buddy=>buddy.user_id == user.id).ToList();
//An enumerated list of user buddies
//do stuff
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3107 次 |
| 最近记录: |