0

我一直在使用 Entity Framework + Self-Tracking 实体,但遇到了一个问题:

有什么方法可以确定实体何时更改?

例如:如果您有一个具有两个字段的实体用户:名称和密码,您可以知道用户实例是否已更改:

<user>.ChangeTracker.State != ObjectState.Unchanged;

我的问题是当用户有一个,而这个人有一个字段电子邮件。我希望如果电子邮件字段发生更改,那么相应的用户也会更改。

我一直在尝试使用以下方法:<user>.StartTrackingAll();但这不适用于导航属性(或者我做错了什么)。可以在此处找到有关此的一些帮助。

请记住,自我跟踪实体是通过 T4 模板自动生成的,因此无法修改类别。

4

2 回答 2

0

首先,当想知道所谓的对象图中的任何实体是否已更改时,您可以递归遍历可跟踪集合中包含的所有实体或根实体(在您的情况下为用户)的一对一导航属性。这样你就可以知道根实体中的人是否发生了变化。这实际上是我检查复杂对象图的任何包含实体中的任何更改的方式。但也用于检查这些实体中是否有任何严重的验证错误(因此用户还不能持久化它们)。

请记住,自我跟踪实体是通过 T4 模板自动生成的,因此无法修改类别。

不对。首先你可以修改 T4 模板来生成更多(复杂的)代码来实现你想要的东西。其次,它生成部分类,可以使用自定义(非生成)代码轻松扩展这些类。

于 2011-07-12T20:09:21.710 回答
0

如果您更改实例中的电子邮件,则Person只有该实例被正确标记为已修改。这是绝对正确的行为。你能指望什么?您是否期望相关实体中的属性更改会将更改的状态传播到关系?这将使 STE 完全无用,因为对实体图的任何单个更改都会使图中的所有实体都被修改,并且每次修改都会导致额外的数据库往返。

如果您想在User更改电子邮件时设置为已修改,只需创建一些方法或处理一些事件并调用person.User.MarkAsModified()

于 2011-07-13T20:49:04.107 回答