我为此请求插入了一个实体,它成功了。
请求
{
"Title": "Book 1"
}
回复
{
"id": 1,
"title": "Book 1",
"serialId": "00000000-0000-0000-0000-000000000000",
"borrows": null,
"votes": null
}
我检查了数据库,并且有id = 1的Book行。但是现在,当我尝试获取列表时,它会返回错误,因为插入后DbSet为空。
var books = db.Books; // count = 0
/books
的响应是一个例外:
"exceptionMessage": "The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; charset=utf-8'.",
内部异常包括Error getting value from 'Borrows'
,所以我认为这可能与关系的定义方式有关,数据库中还没有借用实体。
"exceptionMessage": "Error getting value from 'Borrows' on 'System.Data.Entity.DynamicProxies.Book_6E27A1F717202EA02AE923CCC6405EF9A501FE9A54A71841CEB43E942224D88A'.",
"exceptionType": "Newtonsoft.Json.JsonSerializationException",
Book
实体具有具有定义关系的List导航属性:
modelBuilder.Entity<Book>().HasMany<Borrow>(b => b.Borrows);
用借阅实体列表定义的图书实体:
public virtual List<Borrow> Borrows { get; set; }
Book的迁移仅具有主键的ID:
CreateTable(
"dbo.Books",
c => new
{
Id = c.Int(nullable: false, identity: true),
Title = c.String(),
SerialId = c.Guid(nullable: false),
})
.PrimaryKey(t => t.Id);
问题:是什么导致了此异常,这与我如何定义Book
和Borrow
之间的关系有关?我已经看到必须在两个方向上定义关系的示例,是否需要定义关系以某种方式不需要借用?我注意到过去有结果时会发生DbSet Count = 0,所以我认为NewtonSoft也可能有问题。我不确定这是怎么回事。
答案 0 :(得分:0)
我通过使用以下答案来工作:https://stackoverflow.com/a/14317598/11419029,返回一个列表,而不是IQueryably。
我将其更改为此:
// GET: api/Books
public List<Book> GetBooks()
{
var books = db.Books.ToList();
return books;
}
从此:
// GET: api/Books
public IQueryable<Book> GetBooks()
{
var books = db.Books;
return books;
}
但是我仍然不确定问题是什么,另一个answer表示这与正在执行的查询同时迭代另一个查询的结果有关。触发延迟加载。现在,我担心它正在执行嵌套查询,查询书的每个实例的借用。