簡體   English   中英

EF Core JsonIgnore 不適用於延遲加載

[英]EF Core JsonIgnore does not work with Lazy Loading

我正在使用 EF Core 6 和 .NET 6。

我已經向我的 ASP.NET Web API 添加了延遲加載,並且我想通過在屬性上使用JsonIgnore注釋來防止屬性被序列化。

這樣做的原因是我想通過 Guid 而不是實體本身來管理我的實體中的引用。 例如,當對一個實體執行 GET HTTP 請求時,對其他實體的引用將作為 ids 返回。 但是,在下面的代碼中,我有NotMapped屬性UserRoleIds ,在此之下,用戶UserRoles的實際列表存儲在數據庫中。 但是在對一個實體執行 GET 請求時,會返回UserRoleIdsUserRoles

我有兩個實體類:

public class User
{
    [Key]
    public Guid UserId { get; set; }
    public string UserName { get; set; }
    [NotMapped]
    public ICollection<Guid> UserRoleIds 
    { 
        get 
        {
            if (UserRoles == null)
                return new List<Guid>();
            else
                return UserRoles.ToList().ConvertAll(r => r.RoleId);  
        } 
    }
    [JsonIgnore]
    public virtual ICollection<Role>? UserRoles { get; set; }
}   

public class Role
{
    [Key]
    public Guid RoleId { get; set; }
    
    public string RoleName { get; set; }
    public RoleType RoleType { get; set; }
    
    // Navigation
    [Required]
    public Guid? RoleUserId { get; set; }
    [JsonIgnore]
    public virtual User? RoleUser { get; set; }
} 

這是我的 DbContext:

public class DatabaseContext : DbContext
{
    public DatabaseContext (DbContextOptions<DatabaseContext> options)
        : base(options)
    {
    }

    protected override void OnConfiguring(DbContextOptionsBuilder builder)
    {
        builder.UseLazyLoadingProxies();
    }

    public DbSet<User>? User { get; set; }
    public DbSet<Role>? Role { get; set; }
}

這是我獲取單個用戶的端點:

// GET: api/Users/5
[HttpGet("{id}")]
public async Task<ActionResult<User>> GetUser(Guid id)
{
        if (_context.User == null)
        {
            return NotFound();
        }

        var user = await _context.User.FindAsync(id);

        if (user == null)
        {
            return NotFound();
        }

        return user;
}

現在,結果 - 所需的響應主體將是:

{
    "userId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "userName": "string",
    "userRoleIds": [
      "3fa85f64-5717-4562-b3fc-2c963f66afa6"
    ]
}

但實際的響應體現在看起來像這樣:

{
  "userRoles": [
    {
      "roleId": "edd77715-f330-4662-1074-08da495846f4",
      "roleName": "Role1",
      "roleType": 0,
      "roleUserId": "2580b874-3465-40ca-2c81-08da49583a45"
    }
  ],
  "lazyLoader": {},
  "userId": "2580b874-3465-40ca-2c81-08da49583a45",
  "userName": "User1",
  "userRoleIds": [
    "edd77715-f330-4662-1074-08da495846f4"
  ]
}

如您所見,即使使用了JsonIgnore注釋, UserRoles也會被序列化。 似乎我收到了延遲加載代理對象,而不是實際對象。

奇怪的是,當獲得所有用戶時,一切似乎都運行良好:

我的“獲取所有用戶”端點:

// GET: api/Users
[HttpGet]
public async Task<ActionResult<IEnumerable<User>>> GetUser()
{
        if (_context.User == null)
        {
            return NotFound();
        }

        return await _context.User.ToListAsync();
}

響應正文:

[
  {
    "userId": "2580b874-3465-40ca-2c81-08da49583a45",
    "userName": "User1",
    "userRoleIds": [
      "edd77715-f330-4662-1074-08da495846f4"
    ]
  }
]

在這種情況下, UserRoles屬性未按預期序列化。

這是一個錯誤,已針對 EF Core 7 修復 不要期待 EF Core 6 的修復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM