2013-02-05 115 views
0

我一直在试图创建一个简单的门户来跟踪移动应用程序中的日志。因此,我已经使用实体框架和MVC3来帮助我。然而,最近我一直试图从数据库中检索实体时一直卡住。在实体框架中使用.find方法时的空实体

下面是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是从用户表的外键。

及以下是从控制器中的“详细信息”的方法:

public ActionResult Details(String id, DateTime date) 
    { 
     using (var db = new inspireEntities()) 
     { 
      Run run = db.Runs.Find(id, date); 
      return View(run); 
     } 
    } 

然而,当我尝试运行它,运行对象总是显示为一个

任何建议,非常感谢!

编辑: 这里是主页的看法。

@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运行对象只发生在我直接向数据库中插入语句并且当我尝试使用如上所示的.find方法检索它时。

+0

由于您不共享视图或控制器填充视图,我想知道:你确定这些键总是会返回一个记录?他们是否已经来自数据库? (最佳选择在一起...) –

+0

感谢您的回复!我已经编辑了我的帖子,如上所示。 – user2029253

回答

0

Find()函数返回Collection中匹配项的第一次出现,它将是与条件匹配的单个项目。由于您的视图强烈键入IEnumerable<LifestyleGuide.Models.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); 
     } 
    } 

祝你好运:)。

+0

我已经试过这个方法,对你的代码做了一些小的修改,但是没有成功。有一件事让我感到震惊,那就是运行列表是空的,这意味着where查询有问题。我的User_ID是否是外键是否重要?或者,我的日期没有格式化为数据库和我的视图是相同的吗?我对日期格式有怀疑,因为它仍然是一个日期时间对象。 – user2029253

+0

如何仅通过id给出一个try,看看这个返回值是什么?如果Id部分正在工作,您可以稍后锻炼日期。 –

+0

嘿,谢谢你的帮助!我发现存储在数据库中的DateTime对象包含毫秒,而查询中没有包含该数据。 – user2029253

0

我意识到了这个问题!数据库的每个条目都有一个毫秒数的DateTime对象,而查询则没有。我做了一个解决方法,从所有条目中删除毫秒,它的工作原理!

+0

你销毁了数据以使你的查询工作?! – JayC