“从'System.Data.Entity.DynamicProxies上的'MyEntity'获取值时出错...”

时间:2019-06-28 09:43:38

标签: entity-framework json.net ef-code-first

我为此请求插入了一个实体,它成功了。

请求

{
    "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

enter image description here

/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);

问题:是什么导致了此异常,这与我如何定义BookBorrow之间的关系有关?我已经看到必须在两个方向上定义关系的示例,是否需要定义关系以某种方式不需要借用?我注意到过去有结果时会发生DbSet Count = 0,所以我认为NewtonSoft也可能有问题。我不确定这是怎么回事。

完全例外: https://pastebin.com/raw/BvUfBnKU

1 个答案:

答案 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表示这与正在执行的查询同时迭代另一个查询的结果有关。触发延迟加载。现在,我担心它正在执行嵌套查询,查询书的每个实例的借用。