【问题标题】:how can i know when a self-tracking entity has been changed?我如何知道自我跟踪实体何时更改?
【发布时间】:2011-07-14 04:49:04
【问题描述】:

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

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

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

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

我的问题是当 User 有一个 Person,并且这个人有一个字段 Email。我希望如果电子邮件字段发生更改,则相应的 User 也会更改。

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

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

【问题讨论】:

    标签: entity-framework self-tracking-entities


    【解决方案1】:

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

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

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

    【讨论】:

    • 确实如此,但是在部分类中,您不能在属性更改时添加任何附加行为。而且我认为这应该很简单,改变模板来归档这太激烈了(不是吗??)。正如@LadislavMrnka 在其回答中所说,改变 STE 行为可能会使它们变得无用。
    • @Ariel。您是否阅读了我的答案的第一部分。这就是我使用它的方式。有一个所谓的 WalkEntityGraphHandler,它接受一个(匿名)委托,它检查一个实体是否有 Changetracker.State,然后是 Unchanged(修改、添加、删除)。它是递归的,它会告诉您对象图中的任何实体(只要您想要的深度)是否已更改。
    【解决方案2】:

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

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

    【讨论】:

    • 我不想弄乱 STE,只需要一种方法来确定实体的某些属性何时已更改。如果 person.email 发生变化,则对 User 实体进行某种脏检查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多