entity-framework-4 - 首先在 Entity Framework 代码中使用导航属性

标签 entity-framework-4 ef-code-first asp.net-web-api navigation-properties

语境:

  • 代码优先, Entity Framework 4.3.1;
  • 用户----话题,一对多关系;
  • Userpublic virtual ICollection<Topic> CreatedTopics导航属性(延迟加载);
  • Topicpublic virtual User Creator导航属性;
  • DataServiceController : DbDataController<DefaultDbContext> , Web API 测试版, ASP.NET MVC 4 Beta , 单页应用程序;
  • System.Json 用于 Json 序列化;
  • Web API 操作:
    public IQueryable<Topic> GetTopics()
    {
        // return DbContext.Topics;                   // OK
        return DbContext.Topics.Include("Creator");   //With Exception
    }
    
  • 结果: “w3wp.exe 中发生未处理的 microsoft .net 框架异常”

  • 这里的问题似乎是:我不应该 在两个实体中添加导航属性 (导致循环引用?),如果我删除 CreatedTopics导航属性在 User下课了,又可以了。

    因此,在上面列出的类似上下文中,以下是我的问题:
  • 的情况下如何处理Navigation Properties一对多关系;
  • 更进一步,如何多对多 关系,我必须把它分成两个一对多关系;
  • 使用导航属性的最佳实践和注意事项是什么?

  • 我已经阅读了很多相关的帖子,但仍然不够清楚:(,

    谢谢你的帮助!

    院长

    最佳答案

    这不是代码优先或 EF 的问题——这是序列化的问题。简单地,用于将对象图转换为 Web API 消息中传递的某种表示的序列化程序在默认情况下无法使用循环引用。根据您要使用的消息格式,Web API 默认使用不同的序列化程序 - here更多关于 Web API 使用的默认序列化程序以及如何更改它的方式。以下文本假设您使用的是 DataContractJsonSerializerDataContractSerializer (应该是 XML 序列化的默认值)但 JSON.NET 也是可能的(应该是 JSON 序列化的默认值 - JSON 序列化可以切换到 DataContractJsonSerializer 但默认序列化器更好)。

    那你能做什么?您可以通过使用 DataContract(IsReference = true) 标记您的类来告诉序列化程序它应该跟踪这些循环引用。和每个通过的属性 DataMember属性(查看链接文章以了解如何使用 JSON.NET 实现它)。这将允许序列化程序正确识别循环并且序列化理论上会成功。理论上因为这也要求不使用延迟加载。否则,您可以序列化比预期多得多的数据(在某些灾难性场景中,它可能导致序列化数据库的整个内容)。

    当您在启用延迟加载的情况下序列化实体图时,您会序列化 Topic和它的 Creator但是连载也会访问CreatedTopics属性=>所有相关主题都懒加载并通过序列化处理,序列化继续访问Creator所有新加载的主题!这个过程一直持续到没有其他对象可以延迟加载。因此,在序列化实体时永远不应该使用延迟加载。

    另一种选择是从序列化中排除反向引用。你只需要序列化 ​​Creator .您不需要序列化 ​​CreatedTopics所以你可以用 IgnoreDataMember 标记该属性属性( JsonIgnore 用于 JSON.NET)。问题是,如果您还有返回 User 的 Web API 操作。带着他所有的CreateTopics由于该属性,这将不起作用。

    最后一个选项是不使用实体。此选项通常用于 Web 服务,您可以在其中创建满足特定操作要求的特殊 DTO 对象,并在操作内部处理实体和 DTO 之间的转换(可能借助 AutoMapper 等工具)。

    处理一对一、一对多或多对多关系之间没有区别。如果双方都有导航属性,则必须始终处理此问题。

    关于entity-framework-4 - 首先在 Entity Framework 代码中使用导航属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11315311/

    相关文章:

    entity-framework-4 - 在 Entity Framework 4 中删除数据库数据的最有效方法?

    c# - Entity Framework 过滤的导航属性

    asp.net-mvc - EF 4.5 Code First 复合键的 MVC 脚手架错误

    c# - 通过 CRM Web API 创建注释

    c# - .net核心Web API- Controller 可以将参数传递给中间件吗?

    asp.net-mvc-3 - Entity Framework 4.1 代码优先的 SQL Server 2008 连接字符串

    linq - 左外连接在 LINQPad 中工作(使用 EF 4.3 连接),但在应用程序中失败

    C# 4.0/EF - SQL Server Compact 不支持服务器生成的键和服务器生成的值

    c# - 添加用于测试的 localdb

    c# - dnn WebApi - DnnAuthorize 方法不起作用?