我正在嘗試構建一個簡單的基于 ASP.NET Core 6 的 Web API。我從遵循 Microsoft 的最小 Web API 教程https://docs.microsoft.com/en-us/aspnet/core/tutorials/min-web-api?view=aspnetcore-6.0 開始,該教程有效。然后我使用https://docs.microsoft.com/en-us/ef/core/modeling/relationships作為指南添加了我自己的帶有導航屬性的資料模型,但是當我執行查詢時,該屬性為空。
這是我的模型:
public class Author {
public int Id { get; set; }
public string Name { get; set; }
public List<Book> Books { get; set; }
}
public class Book {
public int Id { get; set; }
public string Title { get; set; }
public Author Author { get; set; }
}
我的 DbContext 如下:
public class LibraryDb : DbContext {
public LibraryDb(DbContextOptions<LibraryDb> options) : base(options) {}
public DbSet<Author> Authors => Set<Author>();
public DbSet<Book> Books => Set<Book>();
}
還有我的申請:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSqlite<LibraryDb>("Data Source=Library.db");
var app = builder.Build();
app.MapGet("/authors", async (LibraryDb db) => await db.Authors.ToListAsync());
app.MapGet("/books", async (LibraryDb db) => await db.Books.ToListAsync());
app.Run();
運行“ef migrations add”和“ef database update”命令后,資料庫結構如下:
CREATE TABLE "Authors" (
"Id" INTEGER NOT NULL CONSTRAINT "PK_Authors" PRIMARY KEY AUTOINCREMENT,
"Name" TEXT NOT NULL
)
CREATE TABLE "Books" (
"Id" INTEGER NOT NULL CONSTRAINT "PK_Books" PRIMARY KEY AUTOINCREMENT,
"AuthorId" INTEGER NOT NULL,
"Title" TEXT NOT NULL,
CONSTRAINT "FK_Books_Authors_AuthorId" FOREIGN KEY ("AuthorId") REFERENCES "Authors" ("Id") ON DELETE CASCADE
)
CREATE INDEX "IX_Books_AuthorId" ON "Books" ("AuthorId")
我在資料庫中填充了幾行(每本書都分配了一個 AuthorId),但這是呼叫我的“/authors”API 時的結果:
[{"id":1,"name":"Clive Barker","books":null},{"id":2,"name":"Stephen King","books":null}]
對于“/books”:
[{"id":1,"title":"Weaveworld","author":null},{"id":2,"title":"The Stand","author":null}]
“書籍”和“作者”欄位為空。生成的 SQL 陳述句似乎沒有進行任何連接 - 我做錯了什么?如果我將路由代碼更改b.Authors.Include(x => x.Books).ToListAsync()為我在其他地方看到的建議,我會收到一個檢測到物件回圈的 JsonException。
uj5u.com熱心網友回復:
這Include是正確的方法(至少其中之一 - 請參閱加載相關資料檔案)。所以添加回你的包含:
b.Authors
.Include(x => x.Books)
.ToListAsync()
下一個問題是由 EF 自動填充參考屬性(稱為關系修復)引起的,這將引入默認情況下序列化程式不處理的回圈。您可以使用下一個設定更改序列化程式行為:
builder.Services.Configure<JsonOptions>(options =>
{
options.SerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles;
});
我個人通常更喜歡從端點回傳一些 DTO 而不是物體本身,這可以讓您對回傳進行更精細的控制,因此將您的查詢結果映射到一些 DTO 也可以解決問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/366673.html
