2011-07-12 86 views
0

我一直在与实体框架+自跟踪实体,并与一个问题就出来了:我如何知道自我跟踪实体的更改时间?

有什么方法来确定当一个实体已经改变?

例如:如果你有一个实体用户有两个领域:

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

我的问题是,当用户:名和密码,你可以,如果一个用户实例已改变使知道有一个,并且该人有一个字段的电子邮件。我希望如果电子邮件字段发生更改,则相应的用户也会更改。

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

请记住,自追踪实体是通过T4模板自动生成的,因此不能修改这些类别。

回答

0

首先,当想要知道所谓对象图中的任何实体是否发生了变化时,您可以通过包含在可追踪集合中的所有实体或根实体(您的案例中的用户)的一对一导航属性进行递归。通过这种方式,您可以知道根实体内部的人是否已更改。这实际上是我如何检查复杂的对象图表中任何包含的实体中的任何更改。但也用于检查这些实体中是否存在严重的验证错误(因此用户无法保留它们)。

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

不正确。首先,您可以修改T4模板以生成更多(复杂)代码以实现您想要的内容。其次,它生成部分类,可以使用自定义(非生成)代码轻松扩展。

+0

这是真的,但在部分类,你不能添加的,当任何aditional的行为财产变化。我认为这应该很简单,改变模板来实现这个太激烈了(不是吗?)。正如@LadislavMrnka所说的那样,改变STE行为可能会使它们无用。 – Ariel

+0

@Ariel。你读过我答案的第一部分了吗?这是我使用它的方式。有一个所谓的WalkEntityGraphHandler,它接受一个(匿名)委托来检查一个实体是否有Changetracker.State,然后是Unchanged(如此修改,添加,删除)。它是递归的,并告诉你对象图中的任何实体(如你想要的那样)已被更改。 –

+0

谢谢,像这样的工作对我来说! – Ariel

0

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

如果你想设置User为修改,当您更改电子邮件只是创造一些方法或处理一些事件,并呼吁person.User.MarkAsModified()

+0

我不想与STE混淆,只是需要一种方法来确定实体的某些属性何时发生变化。在用户实体上提供某种脏检查,如果是person.email更改。 – Ariel