我一直在使用实体框架+自我跟踪实体,并遇到了一个问题:
有没有办法确定实体何时被更改?
例如:如果您有一个实体用户,其中包含两个字段:名称和密码,您可以知道用户实例是否已更改:
<user>.ChangeTracker.State != ObjectState.Unchanged;
我的问题是当用户有人时,该人员有一个字段电子邮件。我希望如果更改了电子邮件字段,则相应的用户也会更改。
我一直在尝试使用诸如<user>.StartTrackingAll();
之类的方法,但这不适用于导航属性(或者我做错了)。可以找到here的一些帮助。
请记住,自我跟踪实体是通过T4模板自动生成的,因此不能修改分词。
答案 0 :(得分:0)
首先,当想要知道所谓的对象图中的任何实体是否已经改变时,您可以通过可跟踪集合中包含的所有实体或根实体的一对一导航属性(在您的情况下为用户)进行递归。这样,您就可以知道根实体内的人是否已更改。这实际上是我如何检查复杂对象图中任何包含的实体中的任何更改。但也可以检查这些实体是否存在严重的验证错误(因此用户无法保留它们)。
请记住,自我跟踪实体是通过T4模板自动生成的,因此不能修改分词。
不正确。首先,您可以修改T4模板以生成更多(复杂)代码,以实现您想要的功能。其次,它生成部分类,可以使用自定义(非生成)代码轻松扩展。
答案 1 :(得分:0)
如果更改Person
实例中的电子邮件,则仅将该实例正确标记为已修改。这是绝对正确的行为。你能指望什么?您是否期望相关实体中的财产变更会将变更后的状态传播给关系?这将使STE完全无用,因为对实体图的任何单一更改都会使图中的所有实体都被修改,并且每次修改都会导致额外的数据包往返。
如果您想在更改电子邮件时将User
设置为已修改,只需创建一些方法或处理某些事件并致电person.User.MarkAsModified()