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>
}
我正在 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>
}