MVC核心:根据主键

时间:2017-09-29 23:51:05

标签: asp.net asp.net-mvc asp.net-core-mvc

我有一个带有另一个表的外键的模型。在这种情况下,豁免对象与办公室对象相关

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);
    }
}

2 个答案:

答案 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上下文类并正确设置模型绑定中WaiversOffice表之间的映射。

希望这有帮助。

答案 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属性。