Sql asp.net mvc 3 EF从一对多关系查询
我是asp.net mvc新手,我有一些问题,我想我可以用asp.net web表单轻松解决它们。然而,项目必须在mvc中,所以问题就在这里 我有X张桌子 表1用户 int用户标识 字符串用户名 表2朋友 int友谊ID int用户标识 int友人ID 在表2中,user_ID表示当前登录的用户。friend_ID表示来自其朋友的ID。这是一对多的关系。 现在我想做的是,在user/details/ID视图中,显示该用户的所有朋友。 我要进行的查询是:首先从表2中选择friend\u ID,其中user\u ID=ID(来自querystring),然后从表1中选择每个用户名,其中user\u ID=friend\u ID 我认为这在SQL中非常容易,但我不知道如何使用mvc语法 控制员: // //获取:/User/Details/5Sql asp.net mvc 3 EF从一对多关系查询,sql,asp.net-mvc-3,entity-framework,Sql,Asp.net Mvc 3,Entity Framework,我是asp.net mvc新手,我有一些问题,我想我可以用asp.net web表单轻松解决它们。然而,项目必须在mvc中,所以问题就在这里 我有X张桌子 表1用户 int用户标识 字符串用户名 表2朋友 int友谊ID int用户标识 int友人ID 在表2中,user_ID表示当前登录的用户。friend_ID表示来自其朋友的ID。这是一对多的关系。 现在我想做的是,在user/details/ID视图中,显示该用户的所有朋友。 我要进行的查询是:首先从表2中选择friend\u ID,其中
public ViewResult Details(int id)
{
User user = db.Users.Find(id);
return View(user);
}
观点:
@model Social2.Models.User
<div class="display-label">Friends</div>
<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<Album> Albums { get; set; }
public DbSet<aspnet_Users> aspnet_Users { get; set; }
public DbSet<Friend> Friends { get; set; }
public DbSet<Group> Groups { get; set; }
public DbSet<Message> Messages { get; set; }
public DbSet<Picture> Pictures { get; set; }
public DbSet<Post> Posts { get; set; }
public DbSet<sysdiagram> sysdiagrams { get; set; }
public DbSet<User> Users { get; set; }
}
公共部分类ASPNETDBEntities:DbContext
{
公共ASPNETDBEntities()
:base(“name=ASPNETDBEntities”)
{
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
抛出新代码FirstException();
}
公共数据库集相册{get;set;}
公共数据库集aspnet_用户{get;set;}
公共数据库集好友{get;set;}
公共数据库集组{get;set;}
公共数据库集消息{get;set;}
公共数据库集图片{get;set;}
公共DbSet Posts{get;set;}
公共数据库集系统图{get;set;}
公共数据库集用户{get;set;}
}
创建自己的ViewModel类。从数据库中检索数据并构建模型类对象。将此模型类传递给视图,即基于此模型类创建视图。由于好友列表属性是虚拟的,因此不会包含在查询中。尝试使用下面的查询包含好友
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);
}
查看:
<table>
@foreach (var friend in @Model.Friends)
{
<tr>
@Html.DisplayFor(modelItem => friend.User.username)
</tr>
}
</table>
@foreach(var friend in@Model.Friends)
{
@DisplayFor(modelItem=>friend.User.username)
}
您的模型类似乎没有遵循实体键的约定。“用户ID”和“友谊ID”字段应为用户ID和友谊ID。或者,如果您想像那样为它们设置关键帧,请使用[key]属性对它们进行注释。请在您的问题中添加正确的标记,以了解您正在使用的数据库访问技术。现在还不清楚什么是
db.Users
。我猜是实体框架,但请准确。同时显示您的模型类。您的问题更多地与您正在使用的数据库访问技术有关,与ASP.NET MVC无关。从模式和Find方法来看,您似乎正在使用EntityFramework DbContext访问数据库。请具体说明。如果是这样的话,可以尝试像db.Users.Include(“Friends”).FirstOrDefault(u=>u.UserId==id)这样的查询代码>您还没有提到您的模型类,因此查询有一些假设。很抱歉,是的,它是EF,请参阅editedOk以及如何在视图中显示它们?是的,它的EF,我编辑并添加了模型。我编辑了这篇文章,没有检查打字错误。我更喜欢在视图中加载用户详细信息,然后在页面加载后通过ajax获得好友列表,最好是json数据。这会让用户感觉网站很快。或者,当浏览器用户点击一些按钮时,通过ajax加载好友,如show friends。好吧,我完全按照你说的做了。第一个用户有两个朋友。当我转到“详细信息”时,它显示的是他的名字的2倍,而不是朋友的名字。我认为应该是friend.User=db.Users.Find(friend.friend\u ID)代码>集合被修改;枚举操作不能执行。当我更改为:friend.User=db.Users.Find(friend.friend\u ID)时,出现此错误;创建用户类的强类型视图。
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);
}
<table>
@foreach (var friend in @Model.Friends)
{
<tr>
@Html.DisplayFor(modelItem => friend.User.username)
</tr>
}
</table>