当前位置: 首页 > 编程语言 > C#

如何在EntityFramework5中表达“多通”关系?分享

时间:2023-04-10 17:16:53 C#

EntityFramework5中如何表达“多通”关系?我正在尝试使用EntityFramework5来查询现有的MySQL数据库。我按照MSDN上的本教程使用代码优先创建映射到现有数据库的基于代码的模型。我有两个表:用户和好友。用户有ID、姓名和电子邮件。Buddy有一个user_id和一个buddy_id。用户有很多好友(也是用户)。buddy_id列是返回Users表的外键。所以每个用户通过好友有很多用户。publicclassUser{publicintId{get;放;}公共字符串名称{得到;放;}公共字符串电子邮件{得到;放;}publicIListBuddies{get;放;}}这是我的数据库访问代码:姓名,Email=user.email,Buddies=newList()};//这显然是非常低效的,但我只是//试图让任何东西工作foreach(Models.buddybuddyindb.buddies)//这一行抛出异常varb=newUser();//获取buddy.user_id并在用户表中找到该用户u.Buddies.Add(b);}}//序列化User并将其写入此处的文件}}此代码在上面指定的行中引发以下异常:System.Data.EntityCommandExecutionException:执行命令定义时出错。有关详细信息,请参阅内部异常。“内部异常是带有消息的MySql.Data.MySqlClient.MySqlException已经有一个与此连接关联的打开的DataReader,必须先将其关闭。我的问题:如何创建一个函数来告诉EF每个用户有多少好友?一旦EF了解到一个用户有很多好友,我如何使用buddy_id查找该好友的用户记录?您有一个数据类型,您正在调用单独的名称。这有点令人困惑。但是,要首先使用代码,您只需要在自定义DbContext类中进行以下流畅的配置:.Map(m=>{m.MapLeftKey("user_id");m.MapRightKey("buddy_id");m.ToTable("buddies");});}假设您的User类如下所示:[Table("user")]publicclassuser{publicintid{get;放;}公共字符串名称{get;放;}公共字符串电子邮件{get;放;}publicvirtualListBuddies{get;放;如果你使用上面的方法,你拥有的每个用户对象都会有一个名为Buddies的导航属性。您需要在查询用户时急切加载好友用户,请执行以下操作:context.users.Include("Buddies")另外,要解决您与多个读者的问题。这是因为您没有在第一个循环中枚举查询(db.users)。要解决此问题,您可以像这样枚举查询:varusers=context.users.Include("Buddies").ToList();foreach(varuserinusers)....如果你使用上面的配置,你不需要尝试匹配id,你只需使用好友导航从用户那里获取好友列表(如果是新的空字段)property(virtual,lazyloaded),do:user.Buddies如您所见,您不需要“Model.buddy”(因为它只包含一个id映射)实体框架将负责链接。但是,如果您不总是在用户查询中包括朋友,则可能需要此表。LINQ会被查询到:所有分享的内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注—varuserBuddies=db.buddies.Where(buddy=>buddy.user_id==user.id).ToList();//用户好友枚举列表//dostuff如转载请注明出处: