在实体框架中使用.find方法时为空实体

时间:2013-02-05 18:02:59

标签: asp.net-mvc-3 entity-framework

我一直在尝试创建一个简单的门户来跟踪移动应用程序中的日志。因此,我使用实体框架和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方法检索它时发生,如上所示。

2 个答案:

答案 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对象,其中包含毫秒,而查询则没有。我做了一个解决方法,从所有条目中删除毫秒,它的工作原理!