问题标签 [navigation-properties]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1157 浏览

c# - 自引用导航属性和json序列化

我有一个公开用户的 Web API。

每个用户都有一个经理,他也是一个用户。

在我的 EDMX 中,我在“用户”实体上有一个 self 1..* 导航属性,它是从经理到用户的导航的“协作者”,也是从用户到他的经理的导航的“经理”。

我的 JSON API 使用 NewtonJSON 来序列化实体。

为了自定义 API 调用的 JSON 结果,我在查询字符串中实现了关键字“字段”。使用“字段”可以获取用户的部分 JSON 表示。

调用如下所示:/api/users?fields=id,name,department,picture

你会从一个完整的 C# 用户对象中得到一个只有 id、name、department 和 picture 属性的 JSON。

我已经使用 IContractResolver 的自定义实现来实现这一点。

问题是 NewtonJSON 合约解析器“按类型”而不是“按对象”工作,这意味着您可以告诉序列化程序序列化声明类型的此类成员而不是另一个成员,但您不能告诉它(如据我所知,这就是我在这里问的原因)序列化这种类型的该对象的此类成员,而不是同一类型的另一个对象上的相同成员。

也就是说,我的问题是当我要求:/api/users?fields=id,name,manager

我在每个用户对象上通过管理器成员的递归序列化得到响应,如下所示:

我还实现了请求部分子实体响应的能力,如下所示:

/api/users?fields=id,name,manager.id

但是由于主对象(这里是用户)和子对象(经理)都属于同一类型,因此它不起作用。

是否有人已经使用 NewtonJSON 来实现部分响应 Web API?您如何设法使用嵌入式自我类型实体?

谢谢你的建议。

0 投票
1 回答
5080 浏览

ef-code-first - Entity Framework 5 - 代码优先数组导航属性一对多与接口类型

这些是我的课:

将此 CommentConfiguration 添加到 OnModelCreate() 中:

我真的不明白为什么属性 Comments 总是为空,以及为什么 EF 不初始化它,因为它是虚拟的。我也尝试禁用延迟加载,但是当我尝试加载导航属性时context.Post.Include("Comments")出现错误告诉我“没有名为评论的导航属性”。所以我尝试使用Entity Framework Power Tools Beta 3查看实体数据模型,我发现即使两个表之间存在关系并且也有评论表端,表“发布”也没有导航端。

我真的不知道该转向哪个方向,可能是阵列的问题?我应该使用 Icollection 属性吗?虽然我无法更改该属性的类型,因为 Post 正在实现一个接口。

我看到的每个样本都清晰且易于制作。请帮助我..提前谢谢你。

编辑:

这是我在查看我昨天发布的链接后所做的更改。

例外是:System.ObjectDisposedException :The ObjectContext instance has been disposed and can no longer be used for operations that require a connection并在应用程序尝试获取评论时引发。如果我删除virtual键异常消失,但属性始终保持为空,并且值不会以任何方式持续存在。

EDITv2 我已经解决了添加新属性并将旧属性映射到它的问题。

在我的 PostConfiguration OnModelCreate() 中,我使用 ListComments 属性作为导航属性,如下所示:

现在它完美地工作了,它比我预期的要简单,当我尝试接收评论集合时,如果我包含“ListComments”属性,我会得到 Post 数组。谢谢您的帮助!

0 投票
1 回答
1757 浏览

entity-framework - 实体框架 + 存储库模式和外键更新不更新相关实体

我正在使用 Entity Framework 5 和 UnitOfWork + Repository 模式。

我正在尝试创建以下实体:

我注意到当我创建填充 IdViaggio 的新 ViaggioAttivita 实体时,当我这样做时

导航属性 attivita.Viaggio 没有得到更新。

如果我直接更新 attivita.Viaggio 而不是 Id

Viaggio 当然会更新,但 IdViaggio 密钥也会更新。

我错过了什么?

为什么我会得到这种差异?

我尝试调用 .Save() 但没有任何变化。

似乎关系只有在我手动更新实体时才会更新,但如果我只更新密钥,它们不会更新。

谢谢

编辑1:

我使用的是 Sql Server 2008、MVC3、Entity Framework 5(当然是运行时 v4.0.30319)。数据库优先模式。这两个表是有关系的(当然,否则不会使用第二种方法填充Key)。

编辑2:

我尝试过去一些 EDMX 信息;

0 投票
1 回答
474 浏览

c# - 延迟加载和多个引用

我的数据库设置有一个实体表,该表具有一个 Ref_Type 导航属性(以及一个引用 TypeID 的 FK)。Type 表有一个 Ref_Department,相同的 FK 设置。最后,Department 表具有 Ref_Locale 和相同的 FK 设置。

我将实体保存在一个列表中,这是一个单例的属性。它的创建如下;

这很好,导航属性已全部加载,我可以访问其中任何一个。当我按如下方式更新实体条目时出现问题;

Ref_Entity 被正确加载,但在 Ref_Entity 中,Ref_Department 只是空。我试过db.Entities.ToList<Entities>();在我的构造函数中使用like,没有骰子。如您所见,我还尝试关闭 LazyLoading(我想我可能需要调用 SaveChanges() 才能实际应用标志)。我也尝试过 .Include("Ref_Department") 但它只是抱怨实体不存在它,这是有道理的。

我传递给 UpdateEntity 方法的 newEnt 没有初始化 Ref_Type,我假设在 UpdateEntity 方法中没有改变的任何东西都会保持不变......

所以现在我对发生了什么以及如何解决它有点茫然。如果有人可以帮助解释我哪里出错了,或者给我一些关于如何修复我的代码以使其工作的指示,那就太好了。

0 投票
2 回答
4209 浏览

asp.net-mvc - 后操作未填充 ASP.NET MVC 4 导航虚拟属性

我在 Question 类上有一个导航属性(Category),我在 Question 的 Create 视图中为其手动创建 DropDownList ,并且在发布 Create 操作时,Category 导航属性未填充到模型上,因此给了我一个无效的模型状态。

这是我的模型:

这是我对 Create 的 GET 和 POST 操作的问题控制器:

这是问题的创建视图

我尝试了以下在视图上生成下拉列表的变体:

当我在 POST 操作上快速查看 Question 对象时,Category 属性为空,但该属性上的 CategoryId 字段设置为视图上的选定类别。

我知道我可以使用从视图中获得的 CategoryId 值轻松添加代码以手动获取具有 EF 的类别。我也认为我可以创建一个自定义活页夹来做到这一点,但我希望这可以通过数据注释来完成。

我错过了什么吗?

有没有更好的方法来为导航属性生成下拉列表?

有没有办法让 MVC 知道如何填充导航属性而无需我手动执行?

- 编辑:

如果有任何区别,我不需要在创建/保存问题时加载实际的导航属性,我只需要将 CategoryId 正确保存到数据库中,这不会发生。

谢谢

0 投票
1 回答
2438 浏览

asp.net-mvc - 实体框架数据库更新:外键引用无效列(导航属性)

这应该很简单。

我有客户和项目:

一切正常。在我的 Projects 表中,我有字段:Client_ClientID 存储关系。

现在我想在 Project 上添加一个导航属性到客户端:

当我运行更新数据库时,我收到错误:

详细的 SQL 显示为:

我不确定为什么在添加约束之前尝试将 Client_ClientID 重命名为 Client_ClientID1 - 看起来很奇怪?

我怎么了?

0 投票
1 回答
3003 浏览

entity-framework - 具有通用存储库的实体框架延迟加载

我当前的项目使用通用存储库接口,因此:

例如,该Get方法如下所示:

我的数据上下文的实例在哪里db,它扩展了实体框架的DbContext. 整个事情的实现IDisposable,以便我可以在工作单元模式的范围块中使用它,在提交更改之前等待结束,或者如果在此之前出现问题,则处理整个事情。

逻辑层使用此接口来处理更复杂的查询,以使业务逻辑与数据访问完全分离。因此,对该层的查询可能如下所示:

(是的,我意识到可以浓缩;它在应用程序中,但例如,这更清楚。)

我的问题是有时我会返回一组对象,然后我可能想要获取它引用的一些东西。例如,当我要显示一个产品时,显示可能想要这样做:

(忽略 HTML 的质量;同样,这是一个简单的示例)

问题是,当 Entity Framework 的延迟加载在从我的查询返回实体时使这些属性为空时,这会引发错误。现在,我知道该Include()方法,但如果我的存储库是通用的,那么很难应用它们。我可以完全关闭它,但是当我不需要它们时,EF 将开始检索大量链接的事物集合——我的模型的结构和事物与审计日志的链接意味着 EF 有很多链接到跟随。

有没有一种方法可以让我以更智能的方式进行延迟加载?是否有类似的方法.Single().Where()我可以调用该方法DbSet,它也会带来子对象,以便我可以专门要求将子对象包含在某个查询中?

0 投票
1 回答
369 浏览

c# - 具有实体框架代码优先导航属性的 ASP.Net MVC

我有一个名为Service如下的实体:

类别由用户通过下拉列表选择,该下拉列表包含 db 中可用类别的 id 和名称。然后 ViewModel 会将该 id 返回给我以保存。到目前为止,我一直这样做的方式是转到我的存储库,获取 id 与视图中所选类别匹配的类别对象,然后分配它。这当然需要往返于数据库。

我想知道,既然我已经有了 id,有没有更好的方法可以在我不去数据库的情况下做到这一点?

0 投票
1 回答
213 浏览

entity-framework - 加载新断开实体的预先存在的导航属性

我有一个新的断开连接的 POCO(在我的情况下来自 aspnet mvc modelbinder)。

外键属性 ( CategoryId) 设置为现有数据库值,但导航引用 ( Category) 起初为空。加载导航参考的正确方法是什么?我希望第一步是将新对象添加到上下文中。那么之前SaveChanges,我可以使用延迟加载,还是LoadProperty,或者我必须手动设置它?

0 投票
0 回答
1159 浏览

c# - 添加具有非主键的导航属性

这是我的简化方案。

我有 2 个数据库表

两个表都有预期的 Id 主键(CustomerId 和 OrderId)。

一个客户可以有多个订单。

在数据库中,没有配置外键,并且由于遗留原因,客户参考订单不是通过 OrderId 字段,而是通过另一个名为 OrderRef 的字段

转发到 EF 并首先编写代码...

我有一个客户和订单 POCO

我需要类似以下的东西......

我的问题是如何告诉 EF 使用 Orders 表上的 OrderRef 字段作为查找的参考?

我意识到数据库设计很糟糕 - 但它不是我的数据库,它是一个遗留数据库,它无法更改。