Entity Framework 和 ASP.NET MVC 模型之间的关系

Relationships between Models with Entity Framework and ASP.NET MVC

我正在 ASP.NET MVC 中创建一个简单的网站。

有一个 事件 列表,其中 用户 可以订阅特定数量。 ( 笔交易)

简短说明: 我想进行基于用户的资金管理。人们可以用钱充值他们的账户。 (交易总和 table,金额)。对于每个事件,他们都可以订阅一定数量。这也是一个交易,但现在特定于一个事件。用户总余额可以通过交易总和table.

用户模型

    [Required]
    [Key]
    public virtual int UserId { get; set; }

    [Required]
    [EmailAddress]
    public virtual string Email { get; set; }

    [Required]
    [DataType(DataType.Password)]
    public string Password { get; set; }

    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual bool Admin { get; set; }

事件模型

    [Required]
    [Key]
    public virtual int EventId { get; set; }

    [Required]
    public virtual string Title { get; set; }

    public virtual string Description { get; set; }

    [Required]
    public virtual DateTime StartDate { get; set; }

    [Required]
    public virtual DateTime EndDate { get; set; }

事务模型

    [Required]
    [Key]
    [Column(Order = 1)]
    public virtual int TransactionId { get; set; }

    [Required]
    [Key]
    [Column(Order = 2)]
    public virtual int UserId { get; set; }

    public virtual int? EventId { get; set; }

    [Required]
    public virtual string Description { get; set; }

    [Required]
    public virtual double Amount { get; set; }

    public virtual UserModel User { get; set; }
    public virtual EventModel Event { get; set; }

所以最主要的是有一个事件。用户可以在哪里参加活动以及他们想要花费的具体金额。不一定要在交易中填写EventId。考虑一个 TOPUP,您只需在当前用户的余额中添加一个金额。

如果我获得事件的详细信息,交易需要出现在列表中。 在我的控制器中,我执行以下操作:

    // GET: Event/Details/5
    public ActionResult Details(int? id)
    {
        var transactions = db.Transactions.Include(t => t.Event).Include(t => t.User).Where(x => x.EventId == id).ToList();

        if (transactions == null)
        {
            return HttpNotFound();
        }
        return View(transactions);
    }

我的视图是这样的:

@model IEnumerable<MyBalance.Models.TransactionModel>
Html.DisplayFor(model => model.First().Event.Title);

@foreach (var item in Model)
                {
                    <tr>
                        <td>@Html.DisplayFor(modelItem => item.User.FirstName)</td>
                        <td>@Html.DisplayFor(modelItem => item.Description)</td>
                        <td>@Html.DisplayFor(modelItem => item.Amount)</td>
                    </tr>
                }

如果有任何交易,这是有效的。 但是,如果我没有任何交易,这将不起作用。

我觉得我做错了什么,我的关系没有得到很好的执行。 我认为我的控制器应该是这样的:

var events = db.Events.Include(t => t.Transaction).Where(x => x.EventId == id).ToList();

.ToList() 不会 return 空值,它会 return Count=0 所以它应该是这样的:

public ActionResult Details(int? id)
    {
        var transactions = db.Transactions.Include(t => t.Event).Include(t => t.User).Where(x => x.EventId == id).ToList();

        if (transactions == null || transactions.Count==0)
        {
            return HttpNotFound();
        }

        return View(transactions);
    }

如果您想显示事件详细信息及其交易列表,则需要为 EventModel 中的交易添加一个导航集合 属性,如下所示:

public virtual ICollection<TransactionModel> Transactions { get; set; }

那么你可以这样查询:

var eventt = db.Events.Include(t => t.Transactions).Where(x => x.EventId == id).FirstOrDefault();

它将 return 一个事件及其所有交易。

然后在视图中你可以这样使用:

@model MyBalance.Models.Event

<h2>Model.Title</h2>

@foreach(var item in Model.Transactions)
{
    <tr>
        <td>@item.Description</td>
        <td>@item.Amount</td>
    </tr>
}