Entity framework .Net Web API-实体框架-在序列化期间忽略关系

Entity framework .Net Web API-实体框架-在序列化期间忽略关系,entity-framework,asp.net-web-api,Entity Framework,Asp.net Web Api,我正在创建一个ASP.NETWebAPI,以公开现有数据库,以便与手持设备一起使用。我对Web API、EF以及我在这个项目中尝试使用的所有其他东西也比较陌生:) 我希望得到的数据传输尽可能轻量级,但是当api返回一个对象时,序列化的JSON本身就有“EntityKey”字段,以及与该对象有关系的其他表中的行 我现在尝试使用ADO.NET DbContext模板生成器生成模型代码。这去掉了EntityKey字段,但我仍然在JSON中显示了关系 我所需要的只是要序列化的对象中的字段,并能够将JSO

我正在创建一个ASP.NETWebAPI,以公开现有数据库,以便与手持设备一起使用。我对Web API、EF以及我在这个项目中尝试使用的所有其他东西也比较陌生:)

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

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

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

我的最佳选择是什么?

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

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

或者(为了便于参考,我会对api使用dynamic或object,而不是JsonResult)

注意,如果您正在使用

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

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

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

对于:'public类Book{public int Id{get;set;}公共字符串名称{get;set;}公共十进制价格{get;set;}}'和控制器:'public Book GetBook(int Id){return books.SingleOrDefault(b=>b.Id==Id);}'如何更改控制器方法以使其能够返回匿名类型?将返回类型更改为动态以便公共动态GetBook(int id)或公共对象GetBook(int id)will也会起作用——JsonResult更多的是用于std MVC而不是API——我记得在添加它之后才意识到我们在谈论API——我不想删除它,因为它是有帮助的——感谢Brett的全面支持。我试过了,它们确实管用,但我认为Ladislav的答案正是我想要的。再想一想:Brett的答案将删除对关系(或您可能不关心的字段)的所有引用,但确实需要修改控制器。Ladislav的答案仍然会引用所有关系(尽管它们是空的json数组),但您只需修改上下文即可在构造函数中全局执行。所以我想这是一个折腾,很好地了解了这两种解决方案。这会持续到本次会议吗?或者直到上下文实例被释放?
public JsonResult GetBook(int id){
return Json(books.SingleOrDefault(b=>b.id == id).Select(new { id = id, Title  = Title, price = Price},JsonRequestBehavior.AllowGet);
}
dbContext.Configuration.LazyLoadingEnabled = false;
// now load your data and return them to serialization