gpt4 book ai didi

json - .Net Core 3 和 EF Core 3 包含问题 (JsonException)

转载 作者:行者123 更新时间:2023-12-02 22:03:06 27 4
gpt4 key购买 nike

我正在尝试使用 .NET Core 3 和 EF Core 开发应用程序。我遇到了一个无法找到解决方案的错误。我无法在“.Net Core 3”上创建一个可以用 PHP eloquent 简单创建的结构。

型号;

public NDEntityContext(DbContextOptions<NDEntityContext> options)
: base(options)
{ }

public DbSet<User> Users { get; set; }
public DbSet<Order> Orders { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<User>(entity =>
{
entity.Property(u => u.CreatedAt)
.HasDefaultValueSql("DATEADD(HOUR, +3, GETUTCDATE())");

entity.HasMany(u => u.Orders)
.WithOne(o => o.User);
});
modelBuilder.Entity<Order>(entity =>
{
entity.Property(o => o.CreatedAt)
.HasDefaultValueSql("DATEADD(HOUR, +3, GETUTCDATE())");

entity.HasOne(o => o.User)
.WithMany(u => u.Orders)
.HasForeignKey(o => o.UserId)
.HasConstraintName("Fk_Order_User");
});
}
}

public class User : EntityBase
{
public int UserId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string FullName { get; set; }
public int Type { get; set; }
public string Email { get; set; }
public string Phone { get; set; }
public string Password { get; set; }
public string Gender { get; set; }
[IgnoreDataMember]
public string HomePhone { get; set; }
[IgnoreDataMember]
public string WorkPhone { get; set; }
public DateTime? BirthDate { get; set; }
public string SmsConfCode { get; set; }
public bool IsActive { get; set; }
public bool IsOutOfService { get; set; }

public ICollection<Order> Orders { get; set; }
}

public class Order : EntityBase
{
public int OrderId { get; set; }

public int UserId { get; set; }
public User User { get; set; }

public decimal Price { get; set; }
}

用户 Controller :

[Route("api")]
[ApiController]
public class UserController : ControllerBase
{
private readonly NDEntityContext _context;
private readonly ILogger<UserController> _logger;

public UserController(ILogger<UserController> logger, NDEntityContext context)
{
_logger = logger;
_context = context;
}

[HttpGet("users")]
public async Task<ActionResult<IEnumerable<User>>> GetUsers()
{
_logger.LogInformation("API Users Get");
return await _context.Users.ToListAsync();
}

[HttpGet("user/{id:int}")]
public async Task<ActionResult<User>> GetUser(int id)
{
_logger.LogInformation("API User Get");
return await _context.Users.Include(u => u.Orders).FirstOrDefaultAsync(e => e.UserId == id);
}
}

启动ConfigureServices

services.AddControllersWithViews().AddNewtonsoftJson(opt => opt.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore);

services.AddDbContext<NDEntityContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DevConnection")));

services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "ND API", Version = "v1" });
});

localhost/api/users/;

[
{
"userId": 1,
"firstName": "John",
"lastName": "Doe",
"fullName": "John Doe",
"type": 1,
"email": "jhondoe@test.com",
"phone": "01234567890",
"password": "123456789",
"gender": "Man",
"homePhone": "123456789",
"workPhone": "987654321",
"birthDate": null,
"smsConfCode": null,
"isActive": true,
"isOutOfService": false,
"orders": null,
"createdAt": "2019-10-01T21:47:54.2966667",
"updatedAt": null,
"deletedAt": null
}
]

localhost/api/user/1/;

System.Text.Json.JsonException: A possible object cycle was detected which is not supported. This can either be due to a cycle or if the object depth is larger than the maximum allowed depth of 32.
at System.Text.Json.ThrowHelper.ThrowInvalidOperationException_SerializerCycleDetected(Int32 maxDepth)
at System.Text.Json.JsonSerializer.Write(Utf8JsonWriter writer, Int32 originalWriterDepth, Int32 flushThreshold, JsonSerializerOptions options, WriteStack& state)
at System.Text.Json.JsonSerializer.WriteAsyncCore(Stream utf8Json, Object value, Type inputType, JsonSerializerOptions options, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Mvc.Formatters.SystemTextJsonOutputFormatter.WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)
at Microsoft.AspNetCore.Mvc.Formatters.SystemTextJsonOutputFormatter.WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResultFilterAsync>g__Awaited|29_0[TFilter,TFilterAsync](ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResultExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.ResultNext[TFilter,TFilterAsync](State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeResultFilters()
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|24_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

HEADERS
=======
Accept: application/json
Accept-Encoding: gzip, deflate, br
Accept-Language: tr,en;q=0.9
Connection: close
Cookie: .AspNet.Consent=yes
Host: localhost:44352
Referer: https://localhost:44352/swagger/index.html
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36
sec-fetch-mode: cors
sec-fetch-site: same-origin

当我删除 .Include(u => u.Orders) 代码时,我可以像 localhost/api/users/ 那样获得成功响应。当我使用 Include 时看到此错误

我想得到这个回复;

{
"userId": 0,
"firstName": "string",
"lastName": "string",
"fullName": "string",
"type": 0,
"email": "string",
"phone": "string",
"password": "string",
"gender": "string",
"birthDate": "2019-10-02T18:24:44.272Z",
"smsConfCode": "string",
"isActive": true,
"isOutOfService": true,
"orders": [
{
"orderId": 0,
"userId": 0,
"price": 0,
"createdAt": "2019-10-02T18:24:44.272Z",
"updatedAt": "2019-10-02T18:24:44.272Z",
"deletedAt": "2019-10-02T18:24:44.272Z"
}
],
"createdAt": "2019-10-02T18:24:44.272Z",
"updatedAt": "2019-10-02T18:24:44.272Z",
"deletedAt": "2019-10-02T18:24:44.272Z"
}

最佳答案

对于 .NET Core 3,NewtonJson 刚刚发布了一个新补丁。当我安装包 Microsoft.AspNetCore.Mvc.NewtonsoftJson 时,问题得到解决。

关于json - .Net Core 3 和 EF Core 3 包含问题 (JsonException),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58207874/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com