问题标签 [self-tracking-entities]

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 投票
2 回答
689 浏览

c# - 具有预生成视图的自我跟踪实体

我目前正在使用 .NET Entity Framework 的 Self Tracking 实体,但是我想加快查询的执行速度。

每个人似乎都建议的第一件事是在编译时为模型生成视图。

使用 ssdl 文件等,我能够创建一个在我的项目中编译的“MyModel.Views.cs”。但是我没有看到这有什么好处?我在这里错过了什么吗?如果我使用自我跟踪实体,我不会从中受益吗?

我可以通过哪些其他方式提高 Entity Framework 的性能?如何创建预编译视图,但提供参数?例如,搜索查询需要采用各种不同的参数,但可以做得更快!

谢谢

0 投票
2 回答
710 浏览

wcf - Entity Framework 4.0 - 我可以通过 WCF 向客户端发送复杂类型吗?

嘿,任何人都可以确认以下情况是否可行:

  • 我正在.NET 4.0 中开发一个 3 层应用程序:Winforms 客户端、aspx 服务器和 SQL 2008 数据库。
  • 服务器通过 Entity Framework 4.0 与 SQL 2008 数据库通信,并通过 WCF 将 STE 形式的实体(在单独的程序集中)返回给客户端应用程序。

现在我想在 SQL 服务器上执行一个存储过程,它将返回一个自定义形状的数据格式(不是与实体的 1:1 映射)。我读到我可以使用复杂类型来保存将返回给我的数据。

现在的问题是:这种复杂类型是否可以通过 WCF 序列化,以便客户端也可以使用它?我想是的,但似乎无法在任何地方找到一个结束的答案,我想在继续编码之前确定。

谢谢 !

TJ

0 投票
2 回答
894 浏览

entity-framework - 自跟踪实体与数据库中的时间戳列

在 web 应用程序的乐观并发场景中,我正在考虑为每个表提供时间戳列 (sqlserver),与 guid 相当。然后,Linq to entity 将生成 sql 更新查询,例如WHERE id = @p0 AND timestamp = @p1在 Entity Framework 中使用特定属性装饰时间戳列时。当返回的更新记录数是0我们检测到并发异常。

在很多帖子中,我正在阅读有关自我跟踪实体的文章,这可能是一种替代或更好的解决方案。但我没有看到比上述“简单”时间戳方法有任何优势。除了数据库不可变且不提供时间戳列的情况。

哪种解决方案更好,为什么?

编辑

Yury Tarabanko 正确地指出 STE 是另一个概念。然而,zeeshanhirani 的回答表明并发检查是跟踪更改的主要动机之一。

让我们重新表述这个问题:为什么有人会使用 STE 概念进行并发检查,而“时间戳列”方法看起来要容易得多。

0 投票
1 回答
296 浏览

entity-framework - 自跟踪实体扩展方法

生成上下文时,我看到有一些扩展方法:AcceptChanges、MarkAsAdded、MarkAsDeleted、MarkAsModified。我什么时候应该使用这些方法,因为它们仅在服务上可用?

0 投票
1 回答
596 浏览

c# - 自我跟踪实体在我的 WCF 服务中返回未更改

我在前端使用 MVP(Model View Presenter)设置了一个小的 n 层 Web 应用程序,后端是一个 WCF 服务,它与 BLL 通信,在 DAL 的后面,它与 EF4.0 通信. 这一切都很好,我创建了几个都可以工作的 Get 和 Add 方法。现在我想创建几个更新方法。由于我使用的是 EF4.0 的自我跟踪实体 (STE),所以我认为一切都会很好,实施也会相当容易。

情况似乎并非如此。在 Web 前端更改我的项目时,它们在移回 WCF 服务时保持状态不变。因为实体没有改变,所以数据库中没有任何更新。通过关于 SO 的这个问题:EF 4 Self Tracking Entities does not work as expected 我看到这篇文章更详细地讲述了有关在 n 层应用程序中实现 STE 的内容。(http://msdn.microsoft.com/en-us/magazine/ee335715.aspx)我引用:

确保在您的客户端上重用自我跟踪实体模板生成的实体代码。 如果您使用由 Visual Studio 或其他工具中的添加服务引用生成的代理代码,大部分情况看起来都是正确的,但您会发现实体实际上并没有跟踪它们在客户端上的更改。

好吧,我已经设法使用以下代码为服务创建了一个客户端:

这似乎工作得很好。问题是,我如何在客户端获取序列化实体?在代码示例中,我看到作者使用以下代码:

但我看不到那些对象/实体/???已定义(我说的是CustomerProduct

我已经使用使用Add Service Reference创建的实体对其进行了测试,但这似乎不起作用。返回的实体仍然具有状态Unchanged

我宁愿不在我的前端引用 EF 实体,因为我想让它们分开并且在我的前端只有序列化的对象。不过,如果真的有必要,我可能只需要这样做。

哦,MarkAsModified()虽然在实体对象上使用该方法确实工作得很好,但这更像是一种黑客行为,因为实体应该自己检查他的状态。

关于如何进行的任何建议?我的猜测是MarkAsModiefied()在我的 Web 应用程序中使用该方法或引用实体模型项目可能是可行的解决方法,但如果有更好的方法,我想先尝试一下。

0 投票
5 回答
19609 浏览

wcf - 自跟踪实体 - 由于对象的键值与 ObjectStateManager 中的另一个对象冲突,AcceptChanges 无法继续

我已经被这个问题困扰了一个多星期了。希望有人能指出我正确的方向。

我首先简要描述一下我的架构。

资产 1--->1 地址 *-->1 地区 *-->1 地区 *-->1 国家

包 1-->* 资产

使用自我跟踪实体 (STE) + WCF。

脚步:

  1. 调用数据存储以获取资产列表。
  2. 调用数据存储以获取软件包列表。
  3. 用户选择一个包并为其分配一些资产。
  4. 保存包。

在第 2 步中,调用使用地址的预先加载。

这是尝试调用时的错误

AcceptChanges 无法继续,因为对象的键值与 ObjectStateManager 中的另一个对象冲突。在调用 AcceptChanges 之前确保键值是唯一的。

编辑

在窥探之后,我发现这是一个 STE 问题。问题是您无法保留包含此处概述的同一实体的多个实例的图形。这是我的问题。

如何将实体添加到我的实体集合中。新实体可能具有包含与集合中已有的相同键的相关实体。即添加可能包含相同地址、区域、地区或国家实体的新资产。

这是我的约束:

  1. 我必须使用导航集合,因为它会影响 UI。
  2. 我无法预取将涉及的所有实体,因为数据集太大了。
  3. 我必须能够随时拍摄实体的快照,以便保留历史记录并使用它来“撤消”任何更改。

我知道Diego B Vega建议的可能解决方案,但这些不是我可以用于我的解决方案的选项。有没有人有其他想法?

0 投票
0 回答
331 浏览

c# - EF4 STE 和 MVC2 - ChangeTracker 未发布

我正在尝试使用 Entity Framework Self-Tracking-Entities 设置 MVC2 应用程序。我的视图是 STE T4 模板生成的实体类型的强类型视图。这是我的 GET:

到目前为止,一切都很好。然而,当这个表单发布时,ChangeTracker 为空/重置为默认值,因此,STE 似乎突然忘记了它应该跟踪自己:

让强类型视图挂在(并回发)整个 STE 的秘诀是什么?如果我必须再次阅读以获取原始值然后应用更改,那似乎违背了自我跟踪实体的目的,不是吗?

0 投票
2 回答
584 浏览

entity-framework - 如何在服务器端创建和存储(自跟踪)实体对象?

我正在尝试使用实体框架 4.0 和自跟踪实体来实现以下目标:

1) 客户端应用程序通过提供 ISBN 号向服务器请求一本书

2) 服务器在其数据库上执行查询以查看这本书是否已经存在

3a) 如果这本书在数据库中,则返回它。

3b) 如果该书不在数据库中,它将向亚马逊查询信息,提取所需的属性,创建新书,将其存储在数据库中,然后将其返回给客户端

现在,3b) 是问题所在......我找不到任何关于如何在服务器端创建实体对象(一本书)、将其添加到上下文并将其存储在数据库中的信息。我尝试了各种各样的事情:

谁能告诉我我做错了什么?看起来问题与 EDMX 模型有关。

我有一个 Book 实体和一个 Author 实体,具有多对多的关系。

Book 实体的 Key 是 ISBN,它是一个最大长度为 13 的字符串。StoreGeneratedPattern 设置为 None。

Author 实体的 Key 是 Id,它是一个 Guid。StoreGeneratedPattern 是身份。

异常消息是:“无法将值 NULL 插入列 'Id',表 'BookBrowser.dbo.Authors';列不允许空值。INSERT 失败。语句已终止。”

但是既然 StoreGeneratedPattern 设置为 Identity,难道不应该自动创建一个 Id 值吗?

谢谢,彼得

0 投票
2 回答
229 浏览

c# - 使用实体框架的自我跟踪实体,我可以执行显式加载吗?

我希望返回一个“业务”实体的图表。商业实体有一个“联系人”集合。

所以我基本上想要这个:

问题是我不想要所有的业务联系人。只有那些有 ContactTypeID = x 的人。我怎样才能做到这一点?我想我可能需要将查询分成两个步骤。1 获取业务,2 获取联系人,然后以某种方式将它们附加到业务。

但我正在使用 STE t4 模板,我不知道如何使用它。

我将不胜感激任何帮助。

0 投票
2 回答
952 浏览

c# - 自跟踪实体 - 从导航属性中删除不会将状态设置为“已删除”

在我的每个 POCO 的构造函数中,我都有这个:

确保为我的一个 POCO 的每个实例打开跟踪。我有一个实体 A,其中包含实体 B 的 TrackableCollection。当我像这样加载我的实体 A 实例时:

查看实体 A 上的 ObjectsAddedToCollection 属性,有 1 个对象标记为“未更改”。当我执行 entityA.EntityB[0].MarkAsDeleted() 时,状态不会设置为“已删除”并移至 ObjectsRemovedFromCollection 集合。它只是被完全删除。我仔细检查了一下,实体 A 和实体 B 的 ChangeTrackingEnabled 都设置为 True。是否有原因导致这不起作用?因此,我无法删除子实体并将更改保存到数据库中。