问题标签 [navigational-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 回答
637 浏览

sql-server-2008 - Entity Framework 4 - 使用 IQueryable 加入 SQL 视图存储库

如果我有以下IQueryable<T>存储库:

我像这样使用它来获得特定的订单:

一切皆好。

现在,我有一个名为OrderDetailsView的 SQL Server 2008 视图,我已将其添加到我的 EDMX 中。它有一个我想加入的名为OrderId的字段。这是OrderOrderDetailsView之间的1-1

我想返回一个特定的订单,以及相应的 OrderDetailsView 记录。

我不确定这里的正确方法是什么。

  • 我可以在我的 Order 实体上拥有 View 的导航属性吗?我可以添加关联——但设计师抱怨它没有被映射——我假设它需要一个 FK,但显然视图不能有 FK。

  • 我需要做一个明确的加入吗?如果是这样,这意味着它们是没有关联的独立实体,所以我需要另一个存储库 - 而且我需要两个数据库调用,因为您不能跨两个存储库执行 JOIN。

理想情况下,我想这样做:

但如前所述,我不知道是否可以添加指向视图的导航属性。

有任何想法吗?

0 投票
1 回答
4551 浏览

c# - 基于抽象实体 (EF CTP5) 的急切加载嵌套导航问题

我的 EF 模型的一部分看起来像这样:

在此处输入图像描述

概括:

  • 位置有很多帖子
  • Post 是一个抽象
  • 讨论来源于帖子_
  • 讨论有很多评论

现在,我试图实现的查询:

获取有关位置 ID 1234 的信息,包括与这些讨论相关的任何讨论和评论。

我可以得到这样的讨论和评论:

但我似乎无法根据Location实体上的Posts导航来获取它。

我试过这个:

哪个编译,但我得到错误:

System.ArgumentException:包含路径表达式必须引用实体定义的属性,还可以选择使用嵌套属性或对 Select 的调用。参数名称:路径

有任何想法吗?我可能会从帖子中“倒退”:

但就我的存储库而言,这既麻烦又语义错误(我不应该通过发布存储库来获取有关位置的信息)。

有任何想法吗?

编辑

所以在仔细考虑之后,我意识到这OfType<T>是一个过滤操作。正如我们所知,EF 不支持预加载过滤。唯一的选择是检索所有内容,或使用匿名类型投影。

我无法检索所有内容,因为涉及的元数据太多。所以我正在尝试匿名类型投影。

0 投票
1 回答
3096 浏览

.net-4.0 - 具有导航属性的 EF4 复杂类型(是否可能)或替代方案?

我使用带有 POCO 的 Linq-to-Entities 使用 DB first 方法做 EF4 Model 碰壁了...

我有两个表:Customer它们NamePrefix通过NamePrefixId. 列是:

在这种情况下,Customer实体具有导航属性NamePrefix。我创建了一个复杂类型NameOfPerson,以便我可以在其他实体中使用它。复杂类型由NamePrefixId, LastName, FirstName,组成MiddleInitial。但现在我在导航属性上收到以下错误消息NamePrefix

有没有办法做到这一点?

0 投票
1 回答
586 浏览

c# - 实体模型 - 如何插入/更新涉及导航属性的数据

我正在使用实体框架、WebForms、.Net Framework 3.5 我想使用实体模型更新数据库中的记录,这也涉及更新外键,这已成为实体中的导航属性。

我怎样才能做到这一点?我见过一种涉及另一个查询的方法,例如

我怎么能不去 DB 做到这一点?

0 投票
2 回答
4230 浏览

entity-framework - 使用交叉引用表创建实体模型 - EntityFramework 4.1

这是我的场景(表格):

当我将这 3 个表导入 EDMX 模型时,我得到 2 个实体:Employee 和 Department。实体 Employee 具有导航属性 Departments,实体 Department 具有导航属性 Employees。

这一切都很好。我其实很喜欢这种方式。

但是,当我想在 XREF 表中添加更多字段时,问题就开始了,例如,我希望有 DateCreated、UserId 字段来记录何时进行更改以及由谁进行更改。如果我在 XREF 表中添加这两个字段,那么我的 EDMX 模型将显示 3 个实体而不是两个。这不是什么大问题,但是由于我已经完成了编码,所以我正在寻找简单的解决方案(以避免编码)。

问题:是否可以在 XREF(交叉引用)表中添加新字段并仅保留两个实体?如果是,我将如何更新我的日期时间和用户 ID 信息?

我假设必须存在 XREF 实体才能更新它(使用日期和用户 ID),但我真的很喜欢具有导航属性:DepartmentsEmployees,而不是具有导航属性EmployeesDepartmentXREFs

这有中间立场吗?最佳做法是什么?

谢谢。

0 投票
1 回答
2241 浏览

linq - 编写 LINQ 查询。加入 VS 导航属性

我正在尝试更多地了解 Linq 查询和实体框架(4.1)。请查看以下两个查询。两个查询都返回汽车类型名称 (CarType.Name)

在第一个查询中,我使用了 join 并忽略了导航属性 CarType

其次,我使用了导航属性 CarType

我在 LinqPad 中运行了两个,因此有 Guid.Parse 函数。

当我运行这些时,第一个语句运行得更快。LinqPad 报告 00:00:036。第二条语句运行速度较慢,LinqPad 报告 00:00:103

从结果来看,使用连接而不是导航属性的 Linq 查询似乎更快。真的是这样吗?请有人对此有所了解。在编写 Linq 查询时,是否有任何一般性指导和最佳实践?

谢谢

0 投票
1 回答
315 浏览

entity-framework - IValidatableObject 的 Validate 方法期间的延迟加载问题

我正在使用 EF4.3、POCO、延迟加载和 IValidatableObject 接口。

我有一个与合同实体有 1-1 关系的贷款实体。合同包含一堆数据,除非需要,否则最好不要加载。

我的问题是......当我对我的贷款实体进行更改时,它的 Validate 方法旨在加载相关的合同实体,以确保其数据根据贷款的状态(或状态)有效......但合同导航属性仍然为空?如果我在调用 SaveChanges 之前立即快速查看贷款,则会加载合同数据并且 SaveChanges 会正常进行,否则会失败。

如果有人能够解释为什么我会看到这种行为,我将不胜感激。

干杯

克雷格

0 投票
1 回答
1082 浏览

entity-framework - EntityFramework 4.3.1 代码优先导航属性映射和可见性

这是一个简短问题的长篇介绍,对不起!

我正在使用 EF 4.3.1 Code First,我有以下模型

还有我的 DBContext 类,在其他一些类库中定义,具有多对多映射:

所以,这行得通。但是,如果注意到该方法Action.AuthorizeRole(Role role)很容易假设角色授权逻辑可能很复杂(现在一些已经授权的验证,但可能是任何验证,对吧?),这在一个好的老式域上是完全有效的模型。但是...根据创建 POCO 代理的要求,角色集合public virtual ICollection<Role> Roles {get; set;}需要公开,至少是吸气剂。这意味着 Action 类的任何客户端都可以添加或删除角色,绕过任何验证逻辑。是的,我想要延迟加载、更改跟踪等工作,所以我确实需要创建代理。

问候,我开始测试一些方法,使我能够将此属性设为public virtual ICollection<Role> Roles {get; set;}非公共属性,以便稍后测试代理创建。由于代理生成了我自己的类的子类,并且由于我信任我的继承者而不是我的客户,所以我决定将属性设为protected这样protected virtual ICollection<Role> Roles {get; set;}。但是,当然,我得到了一个编译错误就行了

因为现在该属性受到保护,不能在 Action 类或其继承者之外访问,当然myDBcontext 类不是其中之一。

所以我需要尝试在myDB不公开它(属性)的情况下从类中访问属性。我虽然反思。我的上下文类看起来像这样:

注意新方法ExtractPropertyValue,在多对多映射指令上调用它。这灵魂工作对吗?HasMany 方法需要一个函数,该函数接收一个 Action 并返回一个 ICollection 的某物(在这种情况下为 Role),这就是得到的。但是不,它不起作用,它当然可以编译,但是在运行时,我得到了类似“这个表达式必须是像 obj => obj.MyProperty 这样的有效属性”的异常。

好吧,它需要是一个“直接”属性,并且它需要可以访问 de DBContext 类。我决定将我的属性设置为受保护的内部并将我的 DBContext 类移动到我的域类库(其中定义了所有实体),我真的不太喜欢它,但我更喜欢让我的属性被所有人访问. 我的财产看起来像这样:

我的 DBContext 类是这样的,就像我第一次拥有它一样,只是它现在定义在与所有实体相同的类库中:

这很好用。因此,现在唯一需要检查的是代理的创建,即延迟加载和更改跟踪。作为受内部保护而不是公共保护的财产,我担心它可能不起作用,但是是的,它确实起作用了,而且一切顺利,真的。

现在,我的问题/请求来了。如果导航属性实际上不需要公开才能创建代理,则受保护就足够了(我将内部排除在外,因为我认为这只会影响使用该属性进行关系映射的能力),为什么要限制在表达式上提取 HasMany 方法的属性,或者更好,因为我知道属性必须是被映射类型的属性而不是随机集合,为什么没有 HasMany 的重载,它采用字符串 propertyName 和搜索财产本身,即使它不是公共财产。这将允许具有非公共导航属性,在我看来,这将一直允许一个整洁设计的对象域。

也许我在这里遗漏了一些东西。

非常感谢。

0 投票
2 回答
967 浏览

.net - 如何在不丢失导航属性的情况下回滚实体删除

我们首先使用实体​​框架代码,当我们不想回滚插入、更新和删除的实体更改时,我遇到了问题SaveChanges()

具体来说,我有一个用作 TableEditor 的 datagridview 来更改一些辅助表。datagridview 绑定到DbSet<TEntity>.

我的更新回滚似乎工作正常,我只是将 currentValues 设置回它们的 OriginalValues,并将状态更改为unchanged.

当一条记录插入到gridview(但没有保存更改)时,它永远不会出现在实体类中,我再也看不到它了......所以我猜它不会进入dbSet,并且没有回滚需要这个吗?

但我的主要问题在于 Delete

据我了解,当一条记录被“删除”(例如tableData.Remove(currentItem);)时,它只是被标记为删除,直到调用 SaveChanges 为止。因此,如果我将 State 从deletedback 更改为unchanged,那应该可以处理回滚,对吗?

好吧,记录确实再次显示,但记录的导航属性消失了!(即包含外键和与其他实体的必需关系的列)。为什么是这样??!

这是我到目前为止所拥有的:

示例用法:

任何想法为什么导航属性会从记录中消失?(或者我能做些什么让他们回来?)


编辑: @Chris 关于使用Refresh

我正在使用DbContext,所以我用这一行替换了我的回滚方法:

但是,这似乎并没有重新加载上下文,因为记录仍然丢失......我用Refresh错了吗?

这听起来像是我的问题的可能解决方案,但我仍然想知道为什么会删除导航属性?

0 投票
4 回答
419 浏览

c# - 实体框架导航属性记录从一个记录移动到另一个“等待操作超时”

我的 Entity 框架存储库中的这个简单函数让我很头疼。我已经做了一百万次类似的事情,但是这个只是一直给我一个WIN32Exception 等待操作超时

个人 (1 - *) 礼物

不知何故,我希望我不能将礼物从 Individu 迁移到另一个,因为我正在循环遍历我正在更改的同一组。

我检查了 sys.dm_tran_locks 并且这没有显示 sql 中任一表上的任何正在运行的锁。

关于如何规避这个问题的任何想法?(增加锁定超时时间没有帮助,我在使用其他导航属性时遇到同样的错误(礼物只是其中之一)

更新: 为了让你们了解我在这里处理的数据量:

有 +- 500.000 INdividus,总共有 +- 1000 万份礼物。每个人有 0 到 100 份礼物

您是否认为这个原因足以将此代码从 EF 中移出并在更新查询中运行迁移?(从上面的数据你可以看到我在一个事务中只更新了 100 行,这已经给了我超时)