Re: WOToOneRelationship and "dirty" editing context
Re: WOToOneRelationship and "dirty" editing context
- Subject: Re: WOToOneRelationship and "dirty" editing context
- From: Chuck Hill <email@hidden>
- Date: Thu, 5 Jan 2006 14:30:24 -0800
Hi Kevin,
On Jan 5, 2006, at 1:00 PM, email@hidden wrote:
On 05 Jan, 2006, at 02:12 PM, Lachlan Deck wrote:
On 06/01/2006, at 4:16 AM, email@hidden wrote:
My problem is that when I merely display the validatedUser and do
not make any changes, I am still seeing the object as being
updated by logging the updatedObjects() of the editing context.
If I remove the WOToOneRelationship from the page, and replace
with a simple WOTextField, I do not see the object as being
updated , when I do not perform any changes to the user. This is
the behavior I would like to see, and would expect, when using
WOToOneRelationship.
Try updating your User like...
public void setDepartment( Department aDepartment ) {
Department currentDepartment;
currentDepartment = department();
if ( currentDepartment != aDepartment ) {
...
}
}
That way your entity will not "update" itself when you're simply
giving it the same value.
While this may work to avoid updating the entity itself, it will
1) break our existing auditing scheme that relies on monitoring
the editing context's updatedObjects NSArray.
Allow me to strongly caution you away from relying on the contents of
the updatedObjects array for an audit trail. It is not what you think
it is, you are heading for problems. An object appearing in that
array only means that willChange() has been called on that object.
It does not mean that it has actually changed. A better name for that
list might be possiblyUpdatedObjects() or
objectToCheckForChangesWhenSaving().
Code like this:
client.setName(client().name())
will also result in the object being added to the updated list.
The definitive way is to filter the objects in that array with the
condition:
object.changesFromSnapshot(object.editingContext
().committedSnapshotForObject(object)).count() > 0
Or you can use a boolean method on your EOs to check this:
public boolean hasBeenUpdated() {
return editingContext().updatedObjects().containsObject(this) &&
(changesFromSnapshot(editingContext().committedSnapshotForObject
(this)).count() > 0);
}
2) require us to manually update nearly all of our entities in our
application (well over 200 that will have to one relationships)
with customized code.
If you are using EOGenerator (and with too entities you ought to
be!), then this update is trivial.
Chuck
This seems like a lot of work in order to use an interface
component (WOToOneRelationship). I guess I am curious why any
object gets tagged as "updated" in the editing context before user
manipulation when using this component? Is it an EOF issue or they
way the WOToOneRelationship works? I have tried the
ERXToOneRelationship and it too has the same effect of tagging my
object as modified upon initial display.
In the old post I referenced (http://www.wodeveloper.com/omniLists/
webobjects-dev/2000/November/msg00119.html), the author mentioned
that WOToOneRelationship uses the takeValueForKey instead of the
validateTakeValueForKey, and somehow this registers a change in the
editing context even values are unchanged. I could not find either
of these in the source for WOToOneRelationship, so I am not sure if
this was fixed in later versions of WO.
I am still very new to WO, so sorry if this is so basic.
--
Coming in 2006 - an introduction to web applications using WebObjects
and Xcode http://www.global-village.net/wointro
Practical WebObjects - for developers who want to increase their
overall knowledge of WebObjects or who are trying to solve specific
problems. http://www.global-village.net/products/practical_webobjects
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden