Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 如何知道自跟踪实体何时已更改?_Entity Framework_Self Tracking Entities - Fatal编程技术网

Entity framework 如何知道自跟踪实体何时已更改?

Entity framework 如何知道自跟踪实体何时已更改?,entity-framework,self-tracking-entities,Entity Framework,Self Tracking Entities,我一直在使用实体框架+自跟踪实体,但发现了一个问题: 是否有任何方法可以确定实体何时被更改?? 例如:如果您有一个实体User,其中包含两个字段:Name和Password,则您可以知道用户实例是否已更改: <user>.ChangeTracker.State != ObjectState.Unchanged; .ChangeTracker.State!=对象状态。未更改; 我的问题是当用户有一个人,而这个人有一个字段电子邮件时。我希望如果电子邮件字段被更改,那么相应的用户也会被

我一直在使用实体框架+自跟踪实体,但发现了一个问题:

是否有任何方法可以确定实体何时被更改??

例如:如果您有一个实体User,其中包含两个字段:Name和Password,则您可以知道用户实例是否已更改:

<user>.ChangeTracker.State != ObjectState.Unchanged;
.ChangeTracker.State!=对象状态。未更改;
我的问题是当用户有一个,而这个人有一个字段电子邮件时。我希望如果电子邮件字段被更改,那么相应的用户也会被更改

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


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

首先,如果想知道所谓对象图中的任何实体是否已更改,您可以通过可跟踪集合中包含的所有实体或根实体的一对一导航属性(您案例中的用户)进行递归。这样,您就可以知道根实体中的某个人是否已更改。这实际上就是我检查复杂对象图中任何包含实体的任何更改的方式。但也用于检查这些实体中是否有任何实体存在严重的验证错误(因此用户还不能持久化它们)

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


不是真的。首先,您可以修改T4模板以生成更复杂的代码,从而实现您想要的功能。其次,它生成的分部类可以很容易地用自定义(非生成)代码进行扩展。

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


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

我不想搞乱STE,只需找到一种方法来确定实体的某些属性是否已更改。如果person.email更改,则对用户实体提供某种脏检查。这是真的,但在局部类中,当属性更改时,不能添加任何传统行为。我认为这应该很简单,将模板更改为archive这太激烈了(不是吗??)。正如@LadislavMrnka在其答案中所说的,改变STE行为可能会使它们变得无用。@Ariel。你读了我答案的第一部分了吗。这就是我使用它的方式。有一个所谓的WalkEntityGraphHandler,它接受一个(匿名)委托,该委托检查一个实体是否有Changetracker.State,然后保持不变(如此修改、添加、删除)。它是递归的,告诉您对象图中的任何实体(如您所需的深度)是否已更改。