我有一个带有另一个表的外键的模型。在这种情况下,豁免对象与办公室对象相关
public class Waiver
{
public int WaiverID { get; set; }
[Required(ErrorMessage = "Please select an Office")]
[Range(1, int.MaxValue, ErrorMessage = "Please select an Office")]
public int OfficeID { get; set; }
//...other properties
}
我有一个按OfficeID过滤的搜索结果:
IEnumerable<Waiver> waiverList = repository.Waivers
.Where(wl => waiverNum == 0 || wl.WaiverID == waiverNum)
.Where(wl => officeId == 0 || wl.OfficeID == officeId)
//...other search criteria
这显示在我的视图中:
@model IEnumerable<Waiver>
@foreach (var item in Model)
{
<tr>
<td class="text-right">@item.WaiverID</td>
<td class="text-right">@item.OfficeID></td>
@* other display columns *@
虽然传递给View的Waiver对象具有OfficeID属性,但我想在Office模型中显示Name属性,因为它对用户更有用。我怎么能做到这一点?
我的EF存储库设置为:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Waiver.Models
//This class implements the IWaiverRepository and gets its data using Entity Framework Core
{
public class EFWaiverRepository : IWaiverRepository
{
private ApplicationDbContext context;
public EFWaiverRepository(ApplicationDbContext ctx)
{
context = ctx;
}
public IEnumerable<Waiver> Waivers => context.Waivers;
public IEnumerable<Office> Offices => context.Offices;
//*****Waiver Methods*****
public void SaveWaiver(Waiver waiver)
{
//if the waiver number is 0, create a new waiver
if (waiver.WaiverID == 0)
{
context.Waivers.Add(waiver);
}
//if there wavier number exists, save the changes to the database
else {
Waiver dbEntry = context.Waivers.FirstOrDefault(w => w.WaiverID == waiver.WaiverID);
if (dbEntry != null)
{
dbEntry.Requestor = waiver.Requestor;
dbEntry.RequestorEmail = waiver.RequestorEmail;
dbEntry.OfficeID = waiver.OfficeID;
dbEntry.RequestDate = waiver.RequestDate;
dbEntry.System = waiver.System;
dbEntry.Source = waiver.Source;
dbEntry.Requirement = waiver.Requirement;
dbEntry.MitigationPlan = waiver.MitigationPlan;
dbEntry.FinalAssessment = waiver.FinalAssessment;
dbEntry.Status = waiver.Status;
//get the signatures
dbEntry.PmSignature = waiver.PmSignature;
dbEntry.PmSignDate = waiver.PmSignDate;
}
}
context.SaveChanges();
}
public Waiver DeleteWaiver(int waiverID)
{
Waiver dbEntry = context.Waivers
.FirstOrDefault(w => w.WaiverID == waiverID);
if (dbEntry != null)
{
context.Waivers.Remove(dbEntry);
context.SaveChanges();
}
return dbEntry;
}
//*****Office Methods*****
public void SaveOffice(Office office)
{
//if the ID=0, its a new entry. Add to db
if (office.OfficeID == 0)
{
context.Offices.Add(office);
} else
{
Office dbEntry = context.Offices.FirstOrDefault(o => o.OfficeID == office.OfficeID);
if (dbEntry != null)
{
dbEntry.Name = office.Name;
dbEntry.SiteID = office.SiteID;
}
}
context.SaveChanges();
}
public Office DeleteOffice(int officeID)
{
Office dbEntry = context.Offices
.FirstOrDefault(o => o.OfficeID == officeID);
if (dbEntry != null)
{
context.Offices.Remove(dbEntry);
context.SaveChanges();
}
return dbEntry;
}
EFRepository实现的地方:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Waiver.Models
{
public interface IWaiverRepository
{
IEnumerable<Waiver> Waivers { get; }
IEnumerable<Office> Offices { get; }
IEnumerable<Site> Sites { get; }
void SaveWaiver(Waiver waiver );
Waiver DeleteWaiver(int waiverID);
void SaveOffice(Office office);
Office DeleteOffice(int officeID);
}
}
答案 0 :(得分:1)
EF Core无法进行延迟加载,因此您需要包含相关实体。解决方案应如下所示。
public class Waiver
{
public int WaiverID { get; set; }
[Required(ErrorMessage = "Please select an Office")]
[Range(1, int.MaxValue, ErrorMessage = "Please select an Office")]
public int OfficeID { get; set; }
public virtual Office Office { set;get;}
}
repository.Waivers
需要更改如下。
<强>更新强>
IEnumerable<Waiver> waiverList = repository.Waivers.Where(wl => waiverNum == 0 || wl.WaiverID == waiverNum).Where(wl => officeId == 0 || wl.OfficeID == officeId)
// ...其他搜索条件
@model IEnumerable<Waiver>
<table>
@foreach (var item in Model)
{
<tr>
<td> @item.WaiverID </td>
<td> @item.OfficeID </td>
<td> @item.Office.Name </td>
</tr>
}
</table>
<强>更新强>
将public IEnumerable<Waiver> Waivers => context.Waivers;
更改为
public IEnumerable<Waiver> Waivers => context.Waivers.Include(o => o.Office);
如果这不起作用,则需要检查db上下文类并正确设置模型绑定中Waivers
和Office
表之间的映射。
希望这有帮助。
答案 1 :(得分:0)
在您的豁免类virtual
类型上添加Office
导航属性。
public class Waiver
{
public int WaiverID { get; set; }
[Required(ErrorMessage = "Please select an Office")]
[Range(1, int.MaxValue, ErrorMessage = "Please select an Office")]
public int OfficeID { get; set; }
public virtual Office Office { set;get;}
}
现在,在您看来,您可以访问每个豁免项目的Office属性
@model IEnumerable<Waiver>
<table>
@foreach (var item in Model)
{
<tr>
<td> @item.WaiverID </td>
<td> @item.OfficeID </td>
<td> @item.Office.Name </td>
</tr>
}
</table>
EF将为您的弃权项加载Office属性。