我一直在尝试创建一个简单的门户来跟踪移动应用程序中的日志。因此,我使用实体框架和MVC3来帮助我。但是最近我在尝试从数据库中检索实体时遇到了困难。
这是Run类:
namespace LifestyleGuide.Models
{
[DataContract(IsReference = true)]
[KnownType(typeof(User))]
public partial class Run
{
[DataMember]
public string User_ID { get; set; }
[DataMember]
public System.DateTime Date { get; set; }
[DataMember]
public Nullable<int> Distance { get; set; }
[DataMember]
public Nullable<int> Duration { get; set; }
[DataMember]
public Nullable<int> Calories { get; set; }
[DataMember]
public virtual User User { get; set; }
}
}
User_ID和日期形成一个复合键,其中User_ID是User表中的外键。
以下是控制器的“详细信息”方法:
public ActionResult Details(String id, DateTime date)
{
using (var db = new inspireEntities())
{
Run run = db.Runs.Find(id, date);
return View(run);
}
}
但是,当我尝试运行它时,运行对象始终显示为 null 。
非常感谢任何建议!
修改 这是主页的视图。
@model IEnumerable<LifestyleGuide.Models.Run>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table>
<tr>
<th>
<center>User ID</center>
</th>
<th>
<center>Date</center>
</th>
<th>
<center>Distance</center>
</th>
<th>
<center>Duration</center>
</th>
<th>
<center>Calories</center>
</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.User_ID)
</td>
<td>
@Html.DisplayFor(modelItem => item.Date)
</td>
<td>
@Html.DisplayFor(modelItem => item.Distance)
</td>
<td>
@Html.DisplayFor(modelItem => item.Duration)
</td>
<td>
@Html.DisplayFor(modelItem => item.Calories)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id = item.User_ID, date = item.Date }) |
@Html.ActionLink("Details", "Details", new { id = item.User_ID, date = item.Date }) |
@Html.ActionLink("Delete", "Delete", new { id = item.User_ID, date = item.Date })
</td>
</tr>
}
</table>
表中的字段直接从数据库填充,因此应该已经存在。
注意:使用视图创建和访问运行对象没有问题。 null 运行对象仅在我直接对数据库执行insert语句以及之后尝试使用.find方法检索它时发生,如上所示。
答案 0 :(得分:0)
Find()
函数返回Collection中第一次出现的匹配项,它将是与条件匹配的单个项。由于您的视图强类型为IEnumerable<LifestyleGuide.Models.Run>
,因此期望Run对象的集合不是单个对象。
您应该修改控制器,以便将Run对象的集合(列表)传递给视图。您可以使用WHERE
这样的句子:
public ActionResult Details(String id, DateTime date)
{
using (var db = new inspireEntities())
{
List<Run> run = db.Runs.Where(r=>r.Id==id && r=>r.Date==date);
return View(run);
}
}
祝你好运:)。
答案 1 :(得分:0)
我意识到了这个问题!数据库的每个条目都有一个DateTime对象,其中包含毫秒,而查询则没有。我做了一个解决方法,从所有条目中删除毫秒,它的工作原理!