0

モバイル アプリケーションからログを追跡するための単純なポータルを作成しようとしています。そのため、これを支援するためにエンティティ フレームワークと 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実行オブジェクトは、データベースに挿入ステートメントを直接実行し、後で上記のように .find メソッドを使用して取得しようとしたときにのみ発生します。

4

2 に答える 2

0

Find()関数は、コレクションから一致するアイテムの最初の出現を返します。これは、条件に一致する単一のアイテムになります。ビューは強く型付けされて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);
        }
    }

幸運を :)。

于 2013-02-06T00:18:12.970 に答える
0

問題に気づきました!データベースへの各エントリにはミリ秒単位の DateTime オブジェクトがありますが、クエリにはありません。すべてのエントリからミリ秒を削除する回避策を実行したところ、うまくいきました!

于 2013-02-07T03:36:45.920 に答える