【问题标题】:.Net Web API - Entity Framework - ignore relationships during serialization.Net Web API - 实体框架 - 在序列化期间忽略关系
【发布时间】:2012-06-19 15:59:08
【问题描述】:

我正在创建一个 ASP.Net Web API 来公开现有数据库以供手持设备使用。我在 Web API、EF 以及我试图在这个项目中使用的所有其他方面也相对较新 :)

我希望生成的数据传输尽可能轻量级,但是当 api 返回一个对象时,序列化的 JSON 具有自身的“EntityKey”字段以及与该对象有关系的其他表中的行。

我现在尝试使用 ADO.NET DbContext 模板生成器来生成模型代码。这摆脱了 EntityKey 字段,但我仍然在 JSON 中显示了关系。

我想要的只是对象中要序列化的字段,并且能够将 JSON 反序列化为这些对象以进行插入和更新。有没有内置的方法可以做到这一点?

我最好的选择是什么?

【问题讨论】:

    标签: entity-framework asp.net-web-api


    【解决方案1】:

    在你的返回值中“选择”一个新类型

    return ienumfromedmx.Select(o=> new { id = id, value = value, name = name});
    

    这些是您要返回的值

    如果您发布一些示例代码,可能会更容易为您提供更相关的代码示例

    使用你的书

    public Book GetBook(int id) { return books.SingleOrDefault(b => b.Id == id);}
    

    改成

    public dynamic GetBook(int id){
    return books.SingleOrDefault(b=>b.id == id).Select(new { id = id, Title  = Title, price = Price});
    }
    

    public object GetBook(int id){
    return books.SingleOrDefault(b=>b.id == id).Select(new { id = id, Title  = Title, price = Price});
    }
    

    或(仅供参考 - 我会为 api 使用动态或对象而不是 JsonResult)

    public JsonResult GetBook(int id){
    return Json(books.SingleOrDefault(b=>b.id == id).Select(new { id = id, Title  = Title, price = Price}));
    }
    

    如果你正在使用请注意

    public JsonResult GetBook(int id){
    return Json(books.SingleOrDefault(b=>b.id == id).Select(new { id = id, Title  = Title, price = Price}));
    }
    

    如果您使用的是 httpget 而不是 post,那么您需要使用

    public JsonResult GetBook(int id){
    return Json(books.SingleOrDefault(b=>b.id == id).Select(new { id = id, Title  = Title, price = Price},JsonRequestBehavior.AllowGet);
    }
    

    【讨论】:

    • so for: 'public class Book { public int Id { get;放; } 公共字符串名称 { 获取;放; } 公共小数价格 { 获取;放; } }' 和控制器:'public Book GetBook(int id) { return books.SingleOrDefault(b => b.Id == id); }' 如何更改控制器方法,使其可以返回匿名类型?
    • 将您的返回类型更改为动态,以便公共动态 GetBook(int id) 或公共对象 GetBook(int id) 也可以工作
    • 抱歉 - JsonResult 更适用于 std MVC 而不是 API - 我在添加它之后才意识到我们正在谈论 API - 不想删除它以防它有帮助跨度>
    • 感谢 Brett 的彻底。我尝试了它们,它们确实有效,但我认为 Ladislav 的答案正是我想要的。
    • 再想一想:Brett 的回答将删除对关系(或您可能不关心的字段)的所有引用,但确实需要修改控制器。 Ladislav 的答案仍将引用所有关系(尽管它们将是空的 json 数组),但您只需修改可以在构造函数中全局执行的上下文。所以我想这有点折腾,很高兴了解这两种解决方案。
    【解决方案2】:

    关闭延迟加载,您的方法将不会返回关系,除非您使用 Include 调用显式加载它们:

    dbContext.Configuration.LazyLoadingEnabled = false;
    // now load your data and return them to serialization
    

    【讨论】:

    • 会话是否持续存在?或者直到上下文实例被释放?
    猜你喜欢
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多