C#Entity Framework - 正确设置模型并读取相关数据

时间:2016-03-06 18:44:35

标签: c# asp.net-mvc entity-framework

我正在尝试创建一个医院系统的以下模型。我的模型设置如下所示:

public class Patient
{
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)]

    public int ID { get; set; }
    public string LastName { get; set; }
    public string FirstName { get; set; }
    public DateTime DOB { get; set; }

    public string FullName
    {
        get { return FirstName + ' ' + LastName; }
    }

    public virtual ICollection<InPatient> InPatients { get; set; }
}

public class InPatient
{
    public int ID { get; set; }
    public int Spell { get; set; }
    public int PatientID { get; set; }
    public int BedID { get; set; }
    public int SourceID { get; set; }
    public DateTime SourceDT { get; set; }
    public string Destination { get; set; }
    public DateTime? DestinationDT { get; set; }
    public int Action { get; set; }

    virtual public Patient Patient { get; set; }
    virtual public Bed Bed { get; set; }
}

public class Bed
{
    public int ID { get; set; }
    public int WardID { get; set; }
    public string BedTitle { get; set; }
    public string BedSex { get; set; }
    public string BedType { get; set; }

    public virtual ICollection<InPatient> Inpatients { get; set; }
    public virtual Ward Ward { get; set; }
}

public class Ward
{
    public int ID { get; set; }
    public string WardTitle { get; set; }

    public virtual ICollection<Bed> Beds { get; set; }
}

我还创建了一个WardIndexData。

public class WardIndexData
{
    public IEnumerable<InPatient> InPatients { get; set; }
    public IEnumerable<Patient> Patients { get; set; }
    public IEnumerable<Bed> Beds { get; set; }
    public IEnumerable<Ward> Wards { get; set; }
}

对于控制器,我试图通过ward/details/WardID访问Ward。由此,根据ID,它将显示该病房的所有床位(被占用或未被占用),并且床上的病人取决于InPatient表 - BedID匹配,并且没有DestinationDT(因此患者仍在那里)。

对于我的控制器课程,我真的不知道如何让病房归还病人。我已经成功获得床位清单,但就是这样,我已经失去了玩代码。我知道,因为它目前是一个完整的混乱,但那是因为我完全混淆和散乱的东西,以获得一些工作。我真的把头发拉出来试图解决这个问题。

    public ActionResult Details(int? id)
    { 
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }

        var viewModel = new WardIndexData();

        viewModel.InPatients = db.InPatients
            .Where(i => i.BedID == b.BedID)
            .Include(i => i.SourceDT)
            .Include(i => i.Bed.BedTitle)
            .Include(i => i.Patient.FullName)
            .Include(i => i.Bed.Ward.WardTitle);

        return View(viewModel);
    }

View(我也知道吐出错误):

@model APT.ViewModels.WardIndexData

@{
    ViewBag.Title = "Details";
}

<h2>Details</h2>

<div>
    <h4>Ward</h4>
    <hr />
    <dl class="dl-horizontal">
        <dt>
            @Html.DisplayNameFor(model => model.WardTitle)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.WardTitle)
        </dd>

    </dl>
    <table class="ward">
        <tr>
            <th>Bed #</th>
            <th>Patient Name</th>
            <th>Admitted Date</th>
        </tr>
        @foreach(var item in Model.Beds)
        {
            ViewBag.bID = item.ID;
            <tr>
                <td>
                    @Html.DisplayFor(ModelItem => item.BedTitle)
                </td>
                <td>
                    Patient Name
                </td>
                <td>
                    Admitted Date
                </td>
            </tr>
        }
    </table>

</div>
<p>
    @Html.ActionLink("Edit", "Edit", new { id = Model.ID }) |
    @Html.ActionLink("Back to List", "Index")
</p>

有人可以告诉我我做错了吗

1 个答案:

答案 0 :(得分:0)

并非一切都很清楚,但我会尽力做出一些假设。

据我所知,您希望在病床上显示病床名单和病床名单(住院病人)。首先,我可以看到您的Bed类型包含InPatient个对象的集合。所以我相信你需要在某个时间点在床上展示病人。我的假设是您希望将其显示为DateTime.Now,并且患者使用SourceDTDestinationDT之间的床位。

总而言之,您的视图模型应该反映您要在视图上显示的内容,因此WardViewModel(由您WardIndexData调用)看起来应该更像这样:

public class WardViewModel
{
    public string Name { get; set; }
    public IList<BedInWardViewModel> Beds { get; set; }
}

BedInWardViewModel

public class BedInWardViewModel
{
    public string Title { get; set; }
    public string PatientName { get; set; }
    public string Admitted { get; set; }
}

因此,您应该编写LINQ查询,以便只获取您真正需要在视图中显示的值,而不是数据库的一半,因为您的应用程序很快就会终止数据库。

所以查询应该是这样的(未经测试):

var viewModel = 
    db.Wards
        .Where(w => w.ID == id)
        .Select(w => new WardViewModel
            {
                Name = w.WardTitle,
                Beds = w.Beds
                    .Select(b => new
                        {
                            b.BedTitle,
                            InPatient = b.Inpatients.FirstOrDefault(
                                i => i.SourceDT < DateTime.Now && (!i.DestinationDT.HasValue || i.DestinationDT > DateTime.Now))
                        })
                    .Select(x => new BedInWardViewModel
                        {
                            Name = x.BedTitle,
                            PatientName = x.InPatient == null ? "[Free]" : x.Patient.Patient.FirstName + " " + x.InPatient.Patient.LastName,
                            Admitted = x.InPatient == null ? "[NA]" : x.InPatient.SourceDT.ToString()
                        })
                    .ToList()
            })
        .Single();

需要在主查询中选择“双”,以确保您不会尝试在空床上访问患者数据。

应该更改视图以反映视图模型中的更改,但我认为它应该是直截了当的。