亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

API端點沒有返回數據,也沒有錯誤

API端點沒有返回數據,也沒有錯誤

C#
互換的青春 2023-09-09 16:25:49
我在 NetCore 2 Entity Framework API 應用程序中有一個簡單的控制器,它應該根據 stateID 獲取國家公園列表:[HttpGet("ListNationalParksByState/{stateId}")]public async Task<ActionResult<IEnumerable<NationalParkList>>> GetNationalParksForState(Guid stateID){    var nationalparkList = await _context.NationalParkList.Where(n => n.StateId == stateID).ToListAsync();    return nationalparkList;}但我返回的 JSON 只顯示了這一點:  [{"state":{"nationalparkList":[然而,當我在該控制器中設置斷點時,它顯示它找到了 3 個國家公園(我不確定 Castle.Proxies 是不是):  [0] {Castle.Proxies.NationalParkListProxy}  [1] {Castle.Proxies.NationalParkListProxy}  [2] {Castle.Proxies.NationalParkListProxy}擴展顯示 3 個國家公園及其所有財產。這是我的 NationalParkList 模型:public partial class NationalParkList{    public NationalParkList()    {        NationalParkLinks = new HashSet<NationalParkLinks>();    }    public string NationalParkId { get; set; }    public Guid StateId { get; set; }    public string NationalParkTitle { get; set; }    public string NationalParkText { get; set; }    public virtual StateList State { get; set; }    public virtual ICollection<NationalParkLinks> NationalParkLinks { get; set; }}這是它在我的 dbcontext 中的定義方式:modelBuilder.Entity<NationalParkList>(entity =>        {            entity.HasKey(e => e.NationalParkId)                .HasName("PK_NationalParkList");            entity.ToTable("nationalparkList");            entity.Property(e => e.NationalParkId)                .HasColumnName("nationalparkID")                .HasMaxLength(50)                .ValueGeneratedNever();            entity.Property(e => e.StateId).HasColumnName("stateID");        });我沒有收到任何錯誤,我只是沒有收到任何數據。有人知道為什么當我點擊這個控制器時沒有得到任何數據嗎?
查看完整描述

1 回答

?
楊魅力

TA貢獻1811條經驗 獲得超6個贊

對象圖中循環的存在很可能導致序列化出現故障。如果是這種情況,我很驚訝您在運行時沒有遇到異常。


AFAIK 你有兩個選擇:


裝飾類中您不想序列化的 props[JsonIgnore]或類似的 props,以避免對象圖中出現循環。


我認為這種方法的最大問題是它的不靈活性:考慮 2 個端點A、BFoo和一個具有多個屬性(包括x、y)的實體類;AFoo需要除x之外的所有道具,B需要除y之外的所有道具。如果類只有一種可能的序列化配置,您將如何處理這個問題Foo?


此外,從純粹主義者的角度來看,添加此類裝飾器會增加實體類的責任/知識,其中包含與業務邏輯無關的內容。


將實體映射到較低級別的對象(又稱 DTO)


另一種方法是將實體映射到(大部分)無行為類的實例中,這些類可以被視為數據傳輸對象。在大多數 Web/控制器層中,您將看到數據對象進出。例如,在您的情況下,您可以重構為以下內容:


public class NationalParkListData

{

? ? public string Id { get; set; }

? ? public Guid StateId { get; set; }

? ? public string Title { get; set; }

? ? public string Text { get; set; }


? ? // Depending on how rest-compliant your approach is, you?

? ? // might include non-collection nested objects or not

? ? public StateListData State { get; set; }

? ? public int NationalParkLinksCount { get; set; }

}


[HttpGet("/states/{stateId:guid}/national-parks")]

public async Task<IActionResult> GetNationalParksForState(Guid stateId, CancellationToken cancellationToken)

{

? ? var stateNationalParks = await _context.NationalParkList

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?.Where(n => n.StateId == stateId)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?.ToListAsync(cancellationToken);

? ? IEnumerable<NationalParkListData> result = // your mapper logic

? ? return this.Ok(result);

}

在這種情況下,您可以很容易地注意到,之前方法中提到的問題并不存在,因為它是由映射層處理的。為了實現映射層,最常見的方法是使用AutoMapper等庫。


查看完整回答
反對 回復 2023-09-09
  • 1 回答
  • 0 關注
  • 114 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號