【问题标题】:Avoiding Circular referencing providing too much data避免循环引用提供过多数据
【发布时间】:2012-12-21 06:26:32
【问题描述】:

我遵循了所有程序以避免在我的 Wines/Vineyard 项目中进行循环引用。但我得到了我不想要的数据:

我不希望每个拥有附属葡萄园的葡萄酒列表都在每次葡萄园列出每种葡萄酒时都有该葡萄园列表。我怎样才能阻止这个?我不想做匿名类型。

更新:

我的 DbContext:

    public DataContext()
    {
        Configuration.LazyLoadingEnabled = false;
        Configuration.ProxyCreationEnabled = false;
    }

我的路线配置:

        config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

我的控制器:

var response = context.Wines.Include("Vineyard").ToList();

【问题讨论】:

  • Jakub,这和中国的茶叶价格有什么关系????

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


【解决方案1】:

你是如何序列化你的数据的?

只是不要序列化您的 wines 集合属性。根据您的序列化机制,您可以使用属性标记它(即ScriptIgnore)或定义具体类型(因为您不喜欢匿名类型)并使用 AutoMapper 复制数据。

将您的 EF 实体直接绑定到 API 的响应并不是最佳设计选择。每次修改数据库架构时,您的 API 都会发生变化。您可以定义 API 控制器将返回的单独类并使用 AutoMapper 复制数据。这样你就可以将你的数据库模式与你的 API 分离。

namespace API {
    class Wine {
        // properties that you want to return goes here
    }
}

Mapper.CreateMap<Wine, API.Wine>(); // Only once during app start
Mapper.Map<Wine, API.Wine>(wine); // AutoMapper will copy data using conventions

【讨论】:

  • 你能举个例子吗?相信我,我非常乐意将您的答案标记为解决方案。天知道使用 ASP.Net API 和 Backbone.js 的整个过程在文档部门开始时是如此稀缺。
  • 如果我对您的理解正确,您担心 DbContext 作为返回的来源。我打算稍后解耦并使用带有 Ninject 的工作单元。但是,假设我理解正确,我看不出解耦数据上下文将如何避免 Json 返回中不必要的冗余。
  • @ScottMalachowski - 你的 API.Vineyard 类没有 wines 属性,所以它不会在 json 中呈现。
  • 好的,我会检查并稍后报告。如果我能做到这一点,我将非常乐意将您的回复标记为解决方案。
猜你喜欢
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多