[英]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 請求時,會返回UserRoleIds
和UserRoles
。
我有兩個實體類:
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.